在运行时检查宏值

时间:2015-05-19 19:07:03

标签: c

假设我在编译期间通过-D传递宏defs:

% gcc -DDEF1=ABC -DDEF2=DEF ...

现在,我需要在运行时检查DEF1或DEF2的值,但这不起作用:

#if DEF1==ABC
...
#else
...
#endif

我做错了什么?有可能实现我的需要吗? 感谢。

3 个答案:

答案 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)