在运行时检查宏变量的值

4
假设我在编译时通过 -D 传递了一个宏定义:
% gcc -DDEF1=ABC -DDEF2=DEF ...

现在,我需要在运行时检查DEF1或DEF2的值,但这样做不起作用:
#if DEF1==ABC
...
#else
...
#endif

我做错了什么?是否有可能达到我需要的目标呢? 谢谢。


可能是 C 中预处理器条件中的字符串比较 的重复问题。 - hugomg
3个回答

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"
}

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

宏是由预处理器扩展为普通的C源代码,然后像普通变量一样使用。例如,如果您有一个名为MY_NUMBER的宏应该被#define为一个数字,那么您可以像处理其他数字一样在运行时检查它的值。

if (MY_NUMBER == 42)
  printf("MY_NUMBER is 42\n");
else
  printf("MY_NUMBER is not 42 but rather %d\n", MY_NUMBER);

然而,如果您的宏展开为不良内容,并且您想要检查该文本,则必须将宏转换为字符串,然后查看该字符串。例如:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接