假设我在编译期间通过-D
传递宏defs:
% gcc -DDEF1=ABC -DDEF2=DEF ...
现在,我需要在运行时检查DEF1或DEF2的值,但这不起作用:
#if DEF1==ABC
...
#else
...
#endif
我做错了什么?有可能实现我的需要吗? 感谢。
答案 0 :(得分:4)
现在,我需要在运行时检查DEF1或DEF2的值,
这是不可能的。甚至在编译之前就会处理预处理器宏的值。
您可以将处理器宏转换为变量值,并在运行时检查变量的值。
以下几行应该有效。
#define STR2(x) #x
#define STR(X) STR2(X)
char const* str = STR(DEF1);
if ( strcmp(str, "ABC") == 0 )
{
// Process "ABC"
}
else if strcmp(str, "DEF") == 0 )
{
// Process "DEF"
}
答案 1 :(得分:2)
你的意思是在编译时,不是吗?运行时if
是没有井号的运行时。
#if
的宏表达式被计算为整数,未定义的宏表达式默认为零。
我不确定你想要完成什么,但是如果在使用#if
打开它们之前在源中定义了宏的值,则可以执行以下操作:
#define APPLE 1
#define ORANGE 2
#define PEAR 3
#if FRUIT==APPLE
const char *fname = "Apple";
#elif FRUIT==PEAR
const char *fname = "Pear";
#elif FRUIT==ORANGE
const char *fname = "Orange";
#else
#error "Must specify a valid FRUIT"
#endif
当然,当你的宏是其中一个可能值的数值或者另一个宏扩展到相同的值时,也会进行选择,这可能会导致意外。
答案 2 :(得分:2)
宏由预处理器扩展为普通的C源代码,然后就像那样使用。例如,如果您的某个宏MY_NUMBER
应为#define
d,则可以在运行时检查其值,就像使用任何其他数字一样。
if (MY_NUMBER == 42)
printf("MY_NUMBER is 42\n");
else
printf("MY_NUMBER is not 42 but rather %d\n", MY_NUMBER);
但是,如果您的宏扩展到令人讨厌的东西,并且您想检查 text ,则必须将宏转换为字符串然后查看该字符串。例如:
if (strcmp(STRINGIZE(MY_MACRO), "for (;;)") == 0)
printf("MY_MACRO was #define'd to an infinite loop.");
如果您以前没有看过它,那么“将字符串化”宏的常用技巧就是这样的。
#define STRINGIZE_R(X) #X
#define STRINGIZE(X) STRINGIZE_R(X)