2013-11-11 3 views
5

Я полагаю, что этот вопрос уже задан, но я не смог его найти. Если я использую макросы вместо констант, как это:Порядок определения глобального const

#define A 0 
#define B (A+1) 
#define C (B+A) 

тогда он гарантированно будет определен в строго определенном порядке (А затем B, то C). Но что произойдет, если вместо этого использовать константы?

const int A = 0; 
const int B = A + 1; 
const int C = A + B; 

Если это функция - это нормально. Но как насчет глобальной сферы? Насколько мне известно, порядок определения глобальных переменных не гарантируется. А как насчет констелов?

Я думаю, что это последнее, что мешает мне использовать consts вместо макросов.

(Мне также интересно, существуют ли какие-либо различия между C и C++ в данном конкретном вопросе).

UPD: Вопрос должен быть следующим: каковы различия (если есть) между C и C++ в этом вопросе?

+0

Задайте только один вопрос на вопрос. В этом случае вы должны выбрать один из них: что задает C? Что говорит об этом C++? Каковы различия между C и C++ об этом? Как вы можете видеть, вы уже получаете ответы на один из этих вопросов, но не на других. Это затрудняет голосование за них и выбор одного из них. Вы можете ввести несколько отдельных Вопросов. –

+0

@EricPostpischil, я полагаю, третий вопрос является самым полным. Спасибо. – Amomum

ответ

3

Ваш код будет работать хорошо до тех пор, пока ваши 3 линии находятся в том же исходном файле , (в C++). В C вы получите сообщение об ошибке.

+3

Не могли бы вы дать мне цитату из стандартного? – Amomum

+0

http://stackoverflow.com/a/10011133/480529 «Объекты, определенные в пределах одной единицы перевода и с упорядоченной инициализацией, должны быть инициализированы в порядке их определений в блоке перевода». представляется актуальным –

2

Определение и инициализация таким образом в глобальном масштабе гарантированно приведет к компиляции ошибки времени (в C):

error: initializer element is not constant 
+3

Это верно в C, а не на C++. В C++ этот код в порядке. –

+0

Thanks Rémi, под редакцией –

+1

Это очень интересно! Я предполагаю, что не заметил этого, потому что компилятор keil не генерирует ошибку на этом! В режиме c99 как минимум. – Amomum

6

Пер §3.6.2/2 в стандарте:

Переменные с упорядоченной инициализации, определенной в пределах одной единицы трансляции должны быть инициализированы в порядке их определения в единице трансляции.

Таким образом, ваш код хорошо сформирован и имеет один результат в любом стандартном компиляторе C++.

0

В C это ошибка, это связано с тем, что переменные const выделяются память компилятором c.

Компилятор C++ может вставлять в код переменную const. Следовательно, C++ не бросает никаких ошибок. const переменные выделяются памятью, только если вы используете адрес (&) с ними.

Следовательно, ваш код будет работать в C++, если 3 строки находятся в указанном порядке. В C компилятор выдает ошибку, из-за того, что инициализация const не может быть выполнена с использованием переменной !!!

Смежные вопросы