如果拼写错误,#ifdef会发出警告

时间:2015-03-14 08:53:47

标签: c++ c-preprocessor

我想使用预处理程序指令来检查是否必须包含我的程序的某些部分,如果我犯了错误或忘记包含包含选项的标题,请警告我。请参阅以下示例,只有#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
};

2 个答案:

答案 0 :(得分:2)

通常的方法是使用#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,但要检查是否包含了特定文件,那么我实际上是说你不应该使用任何检查。只需包含特定文件即可。

答案 1 :(得分:0)

预处理器通常是一个坏主意。只是为未启用多线程的情况创建存根。然后在宣言中加入警卫。其余的代码都没问题。