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想要防止的事情之一,问题中提到的另一个问题是忘记包含定义启用多线程的头。