如果未定义检查布尔宏,则生成错误

Ant*_*nio 19 c c++ macros gcc

我有几个配置文件,每个配置文件包含一些布尔宏的定义,设置为0或1.然后,在我的代码中,我检查这样一个宏的值,以决定激活代码的哪一部分.现在是棘手的部分:我想确保包含我的宏定义的标题.

在下面的示例中,如果我忘记包含包含FOO定义的头文件,编译器将打印"world!",而我希望它生成错误.

//in the configuration header file
#define FOO 1

//in a cpp file
#if FOO  //I would like this to generate an error if I forgot to include the header file
#pragma message "Hello"
#else
#pragma message "world!"
#endif
Run Code Online (Sandbox Code Playgroud)

有可能实现这样的行为吗?怎么样?

为了澄清,我不问如果没有定义宏,如何生成错误,但是如果可以转换该#if FOO行,同时它检查布尔值并在FOO未定义时生成错误.

这样做的关键是开发人员会知道他们的代码应该包含

SPECIAL_MACRO(FOO)
Run Code Online (Sandbox Code Playgroud)

同时,检查FOO的布尔值,就好像它是一个#if FOO语句,并防止它们忘记包含头定义FOO.

Pet*_*ica 26

同事们(嗨Hartmut,Kurt)维护了一个庞大的代码库,这个代码库经过广泛的配置,#define完全符合同样的问题.一个简单的错误拼写,可能在make文件中,可能会导致难以追踪的细微错误.他们的解决方案:使用函数宏!

#if SOME_COND()
 // ...
#endif
Run Code Online (Sandbox Code Playgroud)

如果没有定义SOME_COND(),编译器会抱怨,而不是简单的SOME_COND,如果未定义,它将被0替换.我喜欢它,因为它可以用于传输多个值而不会使用额外的#ifdefs 混乱代码.

  • :-) 他们是优秀的程序员。当您打开汽车的 OEM 导航时,您可能正在使用他们的软件。 (2认同)
  • @Serge你使用三个额外的行pus一个额外的嵌套级别来替换一对().味道不同,但我更喜欢括号.对我而言,这两种方式似乎都是"可控的",无论你的意思是什么. (2认同)

Han*_*son 5

使用函数宏的公认答案是好的,但是如果您想保留普通宏 - 并且仍然使用 FOO 的值(如果定义并生成错误),否则您可以这样做:

#if FOO / defined(FOO)
#else
#endif
Run Code Online (Sandbox Code Playgroud)

如果FOO未定义,它将触发整数除以零。