C++ #如果拼写错误,则带有警告的ifdef

C++ #如果拼写错误,则带有警告的ifdef,c++,c-preprocessor,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

我想使用预处理器指令来检查我是否必须包含程序的某些部分,如果我犯了错误或忘记包含包含选项的标题,就会警告我。请参见下面的示例,是否有更常见的方法仅使用
#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\u multi-threading
的值。在第二个检查中,您正在检查是否定义了
ENABLE\u多线程。考虑当<代码> Enabule-多线程< /代码>被定义为<代码> 0代码>代码>:您的<代码> >如果也不是您的代码>
使用单一检查意味着此类不一致的可能性更小

如果实际上您想检查是否定义了
启用\u多线程
,而不管其值如何,那么

#ifndef ENABLE_MULTITHREADING
# error ENABLE_MULTITHREADING needs to be defined
#endif
但这不允许您使用单个检查:您以后仍然需要检查
ENABLE\u multi-threading
的值


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

预处理器通常不是个好主意。只需为未启用多线程的情况创建一个存根。那就让警卫在申报单上。代码的其余部分就可以了

如果它不能编译,那肯定是好的enough@EdHeal它会很高兴地编译,它只会做错误的事情,使用有效的宏定义。因此,
mt
没有在任何地方使用?@EdHeal如果OP对
mt
的使用受到相同的
启用多线程
条件的保护,我也不会感到惊讶。重构代码,使它只有一个
#ifdef
,并仔细检查是否存在她想要防止的拼写错误类似于
#ifdef ENABLE_multithreading
foo=5的错误
#endif
将以静默方式运行wrong@MattMcNabb这就是我在回答的第一部分中所关注的:如果你确保你只有一次检查,那么至少所有检查都会检查完全相同的东西。(我提到了使用相同名称的细微不同的检查,但它同样适用于使用细微不同名称的相同检查。)但这只是OP想要防止的事情之一,问题中提到的另一个问题是忘记包含定义
启用多线程的头。