C预处理器错误

时间:2014-07-09 13:40:07

标签: c include c-preprocessor kernighan-and-ritchie

我希望代码输出suse.sys但它实际上会输出win.sys。为什么会这样?

 #define SYS SUSE

 #if SYS == WIN
   #define HDR "win.sys"
 #elif SYS == SUSE
   #define HDR "suse.sys"
 #else
   #define HDR "default.sys"
 #endif
 #include HDR
 #include <stdio.h>

 int main()
 {
   char *name = HDR;
   printf("%s\n", name);
   return 0;
 }

这类似于 C 编程语言第二版中的示例。 .sys文件不包含任何内容,它们没有实际用途。

1 个答案:

答案 0 :(得分:3)

==的预处理器比较适用于整数值,而不是字符串或宏名称。您应该能够通过首先使用整数值定义宏SUSEWIN来解决此问题,例如,

#define SUSE 1
#define WIN 2
#define SYS SUSE

在此之后,SYSSUSE都会解析为整数1,并且比较应该有效。

但是,我建议采用更传统的方法为系统定义不同的宏,例如:

#define SYS_SUSE
//#define SYS_WIN

#if defined(SYS_SUSE)
#define HDR "suse.sys"
#elif defined(SYS_WIN)
#define HDR "win.sys"
#else
#define HDR "default.sys"
#endif

这种方法的优点是能够更方便地在命令行,makefile等上指定系统,而不依赖于在每个上下文中定义的数字常量:

cc -DSYS_WIN -c foo.c