为什么#if预处理器不起作用?

时间:2014-03-12 14:54:46

标签: c preprocessor-directive

使用以下代码,我总是得到" VGA"作为输出,当我打算得到" NOT VGA"

#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

3 个答案:

答案 0 :(得分:5)

问题是,VGANVGA在哪里定义?

如果没有定义,根据C标准,它们将等于0(N1570 - 6.10.1条件包含 - 第4段):

  

由于宏扩展和定义的一元所有替换后   运算符已执行,所有剩余的标识符(包括那些词法   用关键字替换为pp-number 0,然后进行每次预处理   令牌被转换为令牌。

这意味着您的比较结果为#if 0==0,与#if 1相同。

要解决此问题,您需要将VGANVGA定义为具有不同的值:

#define VGA  1
#define NVGA 2

答案 1 :(得分:1)

有两种可能性,我无法分辨出哪种可能性。最可能的是,因为NVGAVGA都不是#define d宏,它们在#if中都被评估为零,因此被认为是相等的。 (这是该语言的规则。)第二种可能性是您的系统stdio.hconio.hNVGA定义为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”),你的问题就是第一个。如果您在重新定义NVGAVGA时遇到错误,那么您的问题就是第二个问题。

答案 2 :(得分:0)

因为NVGA本身尚未定义。相反,试试这个:

#define NVGA 0
#define VGA 1

#define ADAPTER VGA

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