我希望代码输出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文件不包含任何内容,它们没有实际用途。
答案 0 :(得分:3)
与==
的预处理器比较适用于整数值,而不是字符串或宏名称。您应该能够通过首先使用整数值定义宏SUSE
和WIN
来解决此问题,例如,
#define SUSE 1
#define WIN 2
#define SYS SUSE
在此之后,SYS
和SUSE
都会解析为整数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