C中预处理器条件下的字符串比较

时间:2013-08-16 17:20:57

标签: c macros

我在makefile中传递一个名为DPATH的编译器选项,类似DPATH=/path/to/somefile。基于此,我必须编写一个宏: -

#if "$(DPATH)"=="/path/to/x"
#error no x allowed
#endif

如何将DPATH与预处理器条件测试中的字符串进行比较?

1 个答案:

答案 0 :(得分:3)

在预处理器中无法执行此操作。 #if只能计算不引用函数或变量的整数表达式。宏扩展后的所有标识符都被零替换,字符串常量会触发自动语法错误。

在不了解您的问题的情况下,我建议编写一个在构建过程中编译并执行的微小测试程序,如果测试没有通过,Makefile goo将使构建失败。< / p>

#include <stdio.h>
#include <string.h>
int main(void)
{
   if (!strcmp(DPATH, "/path/to/x") || some1 == 3 || some2 == 7 || ...)
   {
       fputs("bogus configuration\n", stderr);
       return 1;
   }
   return 0;
}

然后

all : validate_configuration
validate_configuration: config_validator
    if ./config_validator; then touch validate_configuration; else exit 1; fi
config_validator: config_validator.c
    # etc