2015-07-22 1 views
3

Я думал, что эта программа напечатает значение -12--2=-10. Когда я запускаю его, он печатает 0.Препроцессор C - точечное вклеивание - путающий результат. Почему это?

Не могу понять, почему? Любые намеки?

#include <stdio.h> 
#define  ALPHA(x,y)  x##2-y 

int main(void) { 
    int i = -1; 
    int i2 = -2; 
    printf("%d", ALPHA(i, i2)); 
    return 0; 
} 
+2

Подсказка: предварительная обработка происходит до компиляции, а имена переменных - это только токены в этой точке. Значение, которое они получают намного позже во время выполнения, не имеет значения. – Quentin

+3

Вы думали о 'ALPHA (-1, i2)'. – paddy

+0

Или это 'АЛЬФА (-i, 12)'? Это также производит '-10'. – Potatoswatter

ответ

7

Фаза предварительной обработки выполняется перед любой компиляцией и выполняется по тексту. Он не имеет понятия переменных или типов (то есть фазы компиляции), не говоря уже о фактических значениях (время выполнения).

Итак, что вы делаете:

1) ALPHA(i, i2) 
2) i##2-i2 
3) i2-i2 

Таким образом, вы в конечном итоге с printf("%d", i2-i2), который печатает ноль.

5

ALPHA(i, i2) становится i2-i2

За комментарием выше, предварительная обработка является текстовая замена ДО компиляции происходит.

6

препроцессор будет выдавать, что, как:

#include <stdio.h> 

int main(void) { 
    int i = -1; 
    int i2 = -2; 
    printf("%d", i2-i2); 
    return 0; 
} 

Так он будет печатать ноль

2

Вы перепутали i и 1 символов. Попробуйте использовать другой шрифт текстового редактора.

i ## 2 производит i2, который действителен в вашей программе, со значением -2.

1 ## 2 необходимо для получения ожидаемого 12.

Это не соответствует отрицательному знаку, который вы, кажется, ожидаете, но мне все еще нравится эта теория.

5

Процесс компоновки немного отличается от C по сравнению с другими языками программирования. В C, 3 этапа участвуют в получении файла .exe из файла .src.

xyz.c ->препроцессор ->tmp.c (временные) ->КОМПИЛЯТОРА ->xyz.obj ->ЛИНКЕР ->xyz.exe

В принципе, препроцессор читает ваш код по строкам и, если он является инструкцией предварительной обработки, то он выполняет только директиву предварительной обработки и выводит ваш код в компилятор в чистой текстовой форме.

В случае кода, препроцессор будет посылать этот код компилятор для компиляции:

//includes stdio.h from include folder 

    int main(void) 
    { 
     int i = -1; 
     int i2 = -2; 
     printf("%d", i2 - i2); 
     return 0; 
    } 

Итак, когда компилятор компилирует этот код, это даст результата для печати, как только. Это причина, по которой вы печатаете 0, когда вы используете код. Надеюсь, это вам поможет.

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