#ifdef 如果拼写错误会有警告

#ifdef with warning if misspelled

我想使用预处理器指令来检查我是否必须包含我的程序的某些部分,如果我犯了错误或忘记包含包含选项的 header 警告我。请参阅以下示例,是否有更常见的方法仅使用 #if#endif ?

class Foo
{
  private:
#   if ENABLE_MULTITHREADING == 1
    boost::mutex mt;
#   elif !defined(ENABLE_MULTITHREADING)  // I would like to remove
#     error                               // theses two lines
#   endif
};

通常的方法是使用#error

#if ENABLE_MULTITHREADING != 1
# error ENABLE_MULTITHREADING needs to be 1
#endif

另请注意:您的支票看起来 非常 奇怪。在第一次检查中,您正在检查 ENABLE_MULTITHREADING 的值。在第二次检查中,您正在检查 ENABLE_MULTITHREADING 是否已定义。考虑当 ENABLE_MULTITHREADING 定义为 0 时会发生什么:您的 #if#elif 的条件都不为真。

使用单一检查意味着出现此类不一致的可能性较小。

如果您实际上是想检查 ENABLE_MULTITHREADING 是否已定义,而不考虑其值,则

#ifndef ENABLE_MULTITHREADING
# error ENABLE_MULTITHREADING needs to be defined
#endif

但这不允许您使用单个检查:稍后您仍然需要检查 ENABLE_MULTITHREADING 的值。

如果您真正想要的 不是 ENABLE_MULTITHREADING 的检查,而是检查是否包含特定文件,那么我实际上会说你不应该使用 any 检查。只需包含特定文件。

预处理器通常不是一个好主意。只需为未启用多线程的情况创建一个存根。然后在声明中加入守卫。其余的代码会很好。