2015-05-12 4 views
1

я не могу явно найти ответ на этот вопрос, кажется, работает на практике:Определить тело является еще определить

// example #1 
#define test 5 
#define test2 test 

(test2 == 5) == true

И даже это:

// example #2 
#define test2 test 
#define test 5 

Есть явное C правило спецификации, которое позволяет это. Я думал, что препроцессор довольно прост, и он просто находит/заменяет. Но я думаю, что в случае #define test2 test он знает, что тест не является строкой, поэтому может быть define? Итак, препроцессор выполняет множественные проверки только для этого типа сценария?

Мой главный вопрос, почему мой пример № 2 работает?

+1

Он просто находит/заменяет в том порядке, в котором написано '# define's. Итак, это ожидаемое поведение. –

+3

* «он знает, что тест не является строкой» * - препроцессор ничего не знает, кроме подстановки текста. –

+1

@EdCottrell, см. Мой пример # 2. Где test2 определяется первым. Когда я печатаю test2, почему это получается как 5? Порядок определений сломает пример # 2. – jn1kk

ответ

1

В результате первичной обработки:

#define test2 test 
#define test 5 

test2 
test 

дает:

5 
5 

даже с test определяется после test2. Препроцессор пересканирует источник, как указано в:

(C99, 6.10.3.4 Повторное сканирование и далее замена p1) «После того, как все параметры в списке замены были заменены и # и ## обработка имеет место, все placemarker Затем удаляются маркеры предварительной обработки. Затем результирующая последовательность токенов предварительной обработки повторно выполняется вместе со всеми последующими токенами предварительной обработки исходного файла, для замены других имен макросов. "

0

Как первый, обрабатывается:

#define test 5 
#define test2 test 
something with test 
something with test2 

#define test2 5 
something with 5 
something with test2 

something with 5 
something with 5 

Как второй, обрабатывается:

#define test2 test 
#define test 5 
something with test 
something with test2 

#define test 5 
something with test 
something with test 

something with 5 
something with 5 
Смежные вопросы