2014-12-01 2 views
-1

Какой результат возвращает эту конструкцию? Я имею в виду переменную результата в main-function и почему? Я знаю, что пример очень странно;)C препроцессор Результат

header1.h файл:

extern const int clf_1; 

header2.c файл:

#include "header1.h" 
const int clf_1 = 2; 

Файл test.h:

#include <header1.h> 
#define xyz clf_1 
#define NC_CON 2  
#if (xyz== NC_CON) 
#define test 40 
#else 
#define test 41 
#endif 

C файл

#include <header1.h> 
#include <test.h> 
    int main(int argc,char *argv[]) 
    { 
     int result = 0: 
     if (test == 40) 
     { 
      result = 40; 
     } 
    } 
+1

Запустить 'gcc -C -E yoursource.c', чтобы узнать –

+0

ye, я сделал это, и результат 41, но я ожидал 40, потому что xyz == clf_1 и clf_1 == 2 – user3930618

ответ

0

Читайте на вики страницы C preprocessor и документацию GNU cpp (препроцессор внутри GCC, т.е. работать по gcc или g++ ... и т.д.) , Это текстовая вещь, и она выполняется до определения const int clf_1 = 2;, обработанного компилятором. #if директива имеет смысл только тогда, когда все имена, встречающиеся в нем символов препроцессора (определенные с #define или с -D передается в командной строке GCC или Clang/LLVM компилятора)

Использование gcc -C -E yoursource.c > yoursource.i (с некоторыми другими вариантами после gcc , вероятно, -I. нужен ... вы должны #include "header1.h" и т.д ...), а затем искать с помощью редактора или пейджера в сгенерированном yoursource.i (в препроцессоре формы)

мир был бы совсем другим, если C препроцессор преобразованный AST s; по историческим причинам первые препроцессоры C были текстовыми фильтрами (выполнялись как другая программа).

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