C ++如何选择性地用空实现替换函数

时间:2017-03-02 19:52:12

标签: c++ templates preprocessor-directive

我的代码遍布了一个功能。它用于开发,但我不希望它在最终系统中运行。一种方法是使用宏:

#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;
}

这适用于上述简单的情况,但它不适用于我的库,因为他们会抱怨在链接时缺少函数的定义。

这基本上是我的用例。我想为一个可执行目标禁用此功能,但为所有其他目标启用它。

这只是使用宏的理由之一吗?

1 个答案:

答案 0 :(得分:0)

对于&#34;条件编译&#34;宏仍然有用 1 - 至少考虑到优势,您可以在大多数编译器调用的参数中定义或取消定义它们。

例如,这在 NDEBUG &#39; assert及其与SPEAK_ENABLED宏的关系中非常有用。

如果SPEAK_ENABLED依赖于类型或非类型的某些编译时属性,那么您可以使用模板,以及如何执行此操作取决于您的用例。

1 :但是,如果speak()依赖于编译器调用之前已知的某些环境属性,那么MACRO可能仍然具有一定的相关性。

  

这适用于像上面这样的简单案例,但它在我的工作中不起作用   图书馆,因为他们会抱怨缺乏定义   它们被链接时的功能。

为&#34;禁用案例&#34;的or_search_query提供一个空的定义,一个好的优化器可能会删除该调用。