我的代码遍布了一个功能。它用于开发,但我不希望它在最终系统中运行。一种方法是使用宏:
#if SPEAK_ENABLED
#define speak(m) implementation(m)
#else
#define speak(m) ((void)0)
#endif
这很好用,但我想知道是否有任何其他机制(可能使用模板),我可以使用它来获得类似的行为。
我尝试过的一件事是声明一个函数,然后在我所有的主.cpp文件中提供一个实现。例如:
enable.h:
void speak()
{
std::cout << "Output enabled" << std::endl;
}
disable.h:
void speak()
{
}
silent_main.h:
#include "disable.h"
int main(int argc, char *argv[])
{
speak();
return 0;
}
talking_main.h:
#include "enable.h"
int main(int argc, char *argv[])
{
speak();
return 0;
}
这适用于上述简单的情况,但它不适用于我的库,因为他们会抱怨在链接时缺少函数的定义。
这基本上是我的用例。我想为一个可执行目标禁用此功能,但为所有其他目标启用它。
这只是使用宏的理由之一吗?
答案 0 :(得分:0)
对于&#34;条件编译&#34;宏仍然有用 1 - 至少考虑到优势,您可以在大多数编译器调用的参数中定义或取消定义它们。
例如,这在 NDEBUG
&#39; assert
及其与SPEAK_ENABLED
宏的关系中非常有用。
如果SPEAK_ENABLED
依赖于类型或非类型的某些编译时属性,那么您可以使用模板,以及如何执行此操作取决于您的用例。
1 :但是,如果speak()
依赖于编译器调用之前已知的某些环境属性,那么MACRO可能仍然具有一定的相关性。
这适用于像上面这样的简单案例,但它在我的工作中不起作用 图书馆,因为他们会抱怨缺乏定义 它们被链接时的功能。
为&#34;禁用案例&#34;的or_search_query
提供一个空的定义,一个好的优化器可能会删除该调用。