2014-03-12 2 views
1

С помощью следующего кода, я всегда получаю «VGA» в качестве выходного сигнала, когда я намерен получить «НЕ VGA»Почему не работает препроцессор #if?

#include<stdio.h> 
#include<conio.h> 
#define ADAPTER NVGA 
#if ADAPTER==VGA 
int main() 
{ 
printf("VGA"); 
getch(); 
return 0; 
} 
#else 
    int main() 
{ 
printf(" NOT VGA"); 
getch(); 
return 0; 
} 
#endif 
+1

возможно дубликат [Как сравнить строки в C условных препроцессора директив] (http://stackoverflow.com/questions/2335888/how-to-compare-string-in-c-условно-препроцессор-директивы) – Mauren

+2

@Mauren OP не пытается сравнивать * строки * в '# if', но (скорее всего) идентификаторы не' # define'd для любого значения (поэтому они оценивают до нуля в '# if'). – zwol

+0

@ Zack ах я вижу. Я не понял. – Mauren

ответ

5

Вопрос в том, где VGA и NVGA определены?

Если они не определены, то они будут равны 0 в соответствии со стандартом C (N1570 - 6.10.1 Условное включение - пункт 4):

После всех замен в связи с макро-расширения и определенного оператора одинарным были выполнены все остальные идентификаторы (в том числе лексически , идентичные ключевым словам) заменены номером pp 0, а затем каждый токен преобразуется в токен.

Это значит, что сравнение будет #if 0==0, что совпадает с #if 1.

Чтобы исправить это, вам нужно определить как VGA и NVGA иметь различные значения:

#define VGA 1 
#define NVGA 2 
1

Есть две возможности, и я не могу сказать, какой. Скорее всего, это потому, что ни NVGA, ни VGA не являются #define d макросом, они оба оцениваются как 0 в #if и поэтому считаются равными. (Это правило языка.) Вторая возможность заключается в том, что в вашей системе stdio.h или conio.h определяется NVGA - VGA.

Чтобы выяснить, какие, скомпилировать эту программу и посмотреть, что происходит:

#include <stdio.h> 
#include <conio.h> 
/* these numbers are chosen at random */ 
#define NVGA 8446 
#define VGA 13060 
#define ADAPTER NVGA 
int main(void) 
{ 
#if ADAPTER == VGA 
    puts("VGA"); 
#else 
    puts("NOT VGA"); 
#endif 
    getch(); 
    return 0; 
} 

Если он производит вывод вы ожидали (т.е. «НЕ VGA»), ваша проблема является первой один. Если у вас возникла ошибка в переопределении NVGA или VGA, ваша проблема будет второй.

+0

Спасибо. Это первый. – user3411253

0

Поскольку сама NVGA не определена. Вместо этого попробуйте:

#define NVGA 0 
#define VGA 1 

#define ADAPTER VGA 

#if ADAPTER==VGA 
    /* insert VGA code here*/ 
#else 
    /* insert NVGA code here*/ 
#endif