C++ 我能用“如果”做什么?
我在config.h中定义了一系列预处理器配置选项。我这样使用它们:C++ 我能用“如果”做什么?,c++,c-preprocessor,preprocessor-directive,C++,C Preprocessor,Preprocessor Directive,我在config.h中定义了一系列预处理器配置选项。我这样使用它们: #if CONFIG_OPTION1 /* do some stuff */ #endif config.h包含它们的定义: #define CONFIG_OPTION1 _DEBUG #define CONFIG_OPTION2 _DEBUG || (NDEBUG && _WIN64) ... 上述方法不起作用。我想根据配置(调试、发布等)和/或其他定义打开和关闭这些配置选项。如果我这样做,它也不
#if CONFIG_OPTION1
/* do some stuff */
#endif
config.h包含它们的定义:
#define CONFIG_OPTION1 _DEBUG
#define CONFIG_OPTION2 _DEBUG || (NDEBUG && _WIN64)
...
上述方法不起作用。我想根据配置(调试、发布等)和/或其他定义打开和关闭这些配置选项。如果我这样做,它也不起作用:
#define CONFIG_OPTION1 defined(_DEBUG) || defined(NDEBUG)
我从未进入过
#if CONFIG_OPTION1
,即使条件看起来应该满足。当我编写#if defined(_DEBUG)
时,它工作得很好,但是在条件失败时使用宏编写#if
。我怎样才能解决这个问题呢?你已经注意到了,你不能那样做。改为这样做:
#if _DEBUG || (NDEBUG && _WIN64)
# define CONFIG_OPTION2 1
#endif
+1.根据“如果
定义的操作符是宏扩展的结果,C标准会说行为是未定义的。”@CatPlusPlus如果我这样做,我还需要#将它定义为0
,比如在#else
中?@Dave:你不必,否。未定义的宏名称会自动解释为零。@ruakh:依赖未定义的宏为零是一种非常糟糕的做法。最好将宏显式定义为0和1,并将编译器配置为在使用未定义的预处理器符号时发出错误,这样您将发现基本错误,如拼写错误、使用符号而不包含正确的头文件等@Lindydancer:Interest。你说的有道理,但是我上面链接到的GNU C预处理器文档实际上给出了完全相反的建议,比如说,由于这个属性,\if defined-BUFSIZE&&BUFSIZE>=1024
可以“简化”为\if-BUFSIZE>=1024
。