我想使用预处理程序指令来检查是否必须包含我的程序的某些部分,如果我犯了错误或忘记包含包含选项的标题,请警告我。请参阅以下示例,只有#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
};
答案 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)
预处理器通常是一个坏主意。只是为未启用多线程的情况创建存根。然后在宣言中加入警卫。其余的代码都没问题。