【发布时间】:2014-04-22 23:45:13
【问题描述】:
我只是在编写一个函数,我想在我的代码中使用它来调试而不抛出异常。我想要一个已定义的变量 DEBUG_MODE,当设置为 true 时会导致函数打印给定消息,而当设置为 false 时不打印任何内容。我希望它可用于导入文件而无需创建类的任何类,即我包含“Debug.h”并且可以调用 Debug::Log(string message)。
我读到了使用命名空间函数的优点,所以我就这样写了它,但也许我不理解命名空间函数的正确用法。当我在一个类中包含带有命名空间函数的头文件时,它工作得很好,当我在两个不同文件的两个类中使用它时,我得到一个链接器错误:
Error 1 error LNK2005: "void __cdecl Debug::Log(char const *)" (?Log@Debug@@YAXPBD0@Z) already defined in Foo.obj...
这是我的命名空间函数的代码:
#pragma once
#include <cstdio>
// IMPORTANT: Set this to true if you want debug logging, false otherwise
#define DEBUG_MODE true
namespace Debug
{
void Log(const char* message)
{
if (DEBUG_MODE)
printf(message);
}
void Log(const char* messageFormat, const char* parameter)
{
if (DEBUG_MODE)
printf(messageFormat, parameter);
}
}
现在,如果我将函数设为静态,那么一切正常,但我的印象是,在我的情况下,使用命名空间函数可以替代静态函数。如果可能的话,我还希望能够在另一个文件中定义静态函数。
我应该使用什么?静态函数?命名空间函数?如果是后者,那么如何在两个单独的类/文件中使用命名空间函数而不导致上述链接器错误?
【问题讨论】:
标签: c++ static namespaces