找到一个或多个多重定义的符号

Tia*_*sta 41 c++

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++标准的一个定义规则规定,在程序中使用的每个非内联函数应该只出现一个定义.因此,另一种方法是使您的函数内联.

  • OMFG给你我的F-ING PAYPALL ILL给你很多钱给你MFKR (4认同)
  • 我有同样的问题.我的头文件中的命名空间中有一些常量值.这是一个数学库,所以我将它们内联,但是常量值呢? (2认同)

GWW*_*GWW 9

使函数内联或在头文件中声明函数并在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文件中.

  • 当你想要内联函数时,`inline`ing是需要考虑的事情,而不是你用来解决编译器错误的东西,因为你不明白发生了什么. (3认同)

Lig*_*ica 6

(假设发布的代码是一个标题,包含在多个.cpp文件中)

标题保护不保护您免受链接时多重定义的影响.无论您是否确保每个翻译单元只显示一次标题,如果您有多个翻译单元,那么这仍然是多个定义.

在源文件中写入定义,仅在头文件中写入声明.

唯一的例外是inline函数,定义中class定义的函数(虽然不建议这样做!)和函数模板.