【发布时间】:2017-03-02 19:52:12
【问题描述】:
我的代码中散布着一个函数。它用于开发,但我不希望它在最终系统中运行。一种方法是使用宏:
#if SPEAK_ENABLED
#define speak(m) implementation(m)
#else
#define speak(m) ((void)0)
#endif
这很好用,但我想知道是否有任何其他机制(可能使用模板)可以用来获得类似的行为。
我尝试过的一件事是声明一个函数,然后在我的所有主要 .cpp 文件中提供一个实现。例如:
启用.h:
void speak()
{
std::cout << "Output enabled" << std::endl;
}
禁用.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;
}
这适用于上述简单情况,但不适用于我的库,因为它们会在链接时抱怨缺少函数的定义。
这基本上是我的用例。我想为一个可执行目标禁用此功能,但为所有其他目标启用它。
这只是可以使用宏的实例之一吗?
【问题讨论】:
-
您的宏示例实际上是错误的 - 在
#if分支中,您不应使用分号终止扩展命令,而在#else分支中,您应该扩展为无操作((void)0)而是 -
感谢您的信息。这就说得通了。我很快从别处复制了它。我会编辑修复它。
标签: c++ templates preprocessor-directive