预处理器检查是否未定义多个定义

Tob*_*oby 58 c c-preprocessor

我在用户可编辑的标题中选择了#define,因此我随后希望检查定义是否存在以防用户完全删除它们,例如

#if defined MANUF && defined SERIAL && defined MODEL
    // All defined OK so do nothing
#else
    #error "User is stoopid!"
#endif
Run Code Online (Sandbox Code Playgroud)

这完全没问题,我想知道是否有更好的方法来检查是否有多个定义没有到位...即:

#ifn defined MANUF || defined SERIAL ||.... // note the n in #ifn
Run Code Online (Sandbox Code Playgroud)

或者可能

#if !defined MANUF || !defined SERIAL ||....
Run Code Online (Sandbox Code Playgroud)

删除空#if部分的需要.

Ser*_* L. 99

#if !defined(MANUF) || !defined(SERIAL) || !defined(MODEL)
Run Code Online (Sandbox Code Playgroud)

  • parens的一个好处是,如果`MANUF`碰巧是复合语句(即1 + 1),那么你将检查整个语句,而不仅仅是它的第一部分. (6认同)
  • 实际上你没有,但我建议它的可读性.https://godbolt.org/g/O48eun (4认同)

net*_*ink 8

FWIW,@SergeyL 的答案很好,但这里有一个用于测试的轻微变体。注意逻辑or 到逻辑and 的变化。

main.c 有一个像这样的主包装器:

#if !defined(TEST_SPI) && !defined(TEST_SERIAL) && !defined(TEST_USB)
int main(int argc, char *argv[]) {
  // the true main() routine.
}
Run Code Online (Sandbox Code Playgroud)

spi.c、serial.c 和 usb.c 都有各自测试代码的主要包装器,如下所示:

#ifdef TEST_USB
int main(int argc, char *argv[]) {
  // the  main() routine for testing the usb code.
}
Run Code Online (Sandbox Code Playgroud)

所有 c 文件都包含的 config.h 有一个像这样的条目:

// Uncomment below to test the serial
//#define TEST_SERIAL


// Uncomment below to test the spi code
//#define TEST_SPI

// Uncomment below to test the usb code
#define TEST_USB
Run Code Online (Sandbox Code Playgroud)