DebugUtil.h
#ifndef DEBUG_UTIL_H
#define DEBUG_UTIL_H
#include <windows.h>
int DebugMessage(const char* message)
{
const int MAX_CHARS = 1023;
static char s_buffer[MAX_CHARS+1];
return 0;
}
#endif
Run Code Online (Sandbox Code Playgroud)
当我尝试运行它时,我收到此错误:
Terrain.obj:错误LNK2005:已在Loodus.obj中定义的"int __cdecl DebugMessage(char const*)"(?DebugMessage @@ YAHPBD @ Z)
Renderer.obj:错误LNK2005:已在Loodus.obj中定义的"int __cdecl DebugMessage(char const*)"(?DebugMessage @@ YAHPBD @ Z)
test.obj:错误LNK2005:已在Loodus.obj中定义的"int __cdecl DebugMessage(char const*)"(?DebugMessage @@ YAHPBD @ Z)
C:\ Users\Tiago\Desktop\Loodus Engine\Debug\Loodus Engine.exe:致命错误LNK1169:找到一个或多个多重定义的符号
但为什么会这样呢?我在标题中有#ifndef #define和#endif,因此不应该发生多个定义
Arm*_*yan 65
将定义(正文)放在cpp文件中,只在ah文件中保留声明.包含警卫仅在一个翻译单元(也称为源文件)内运行,而不是在所有程序中运行.
C++标准的一个定义规则规定,在程序中使用的每个非内联函数应该只出现一个定义.因此,另一种方法是使您的函数内联.
使函数内联或在头文件中声明函数并在cpp文件中定义它.
inline int DebugMessage(const char* message)
{
const int MAX_CHARS = 1023;
static char s_buffer[MAX_CHARS+1];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
正如Tomalak Geret'kal的评论所暗示的那样,最好使用我后面的建议而不是我以前的建议,并将函数的声明移到cpp文件中.
(假设发布的代码是一个标题,包含在多个.cpp文件中)
标题保护不保护您免受链接时多重定义的影响.无论您是否确保每个翻译单元只显示一次标题,如果您有多个翻译单元,那么这仍然是多个定义.
在源文件中写入定义,仅在头文件中写入声明.
唯一的例外是inline函数,定义中class定义的函数(虽然不建议这样做!)和函数模板.
| 归档时间: |
|
| 查看次数: |
71930 次 |
| 最近记录: |