gpt4 book ai didi

c++ - 为什么在 header 的命名空间内定义的自由函数会导致 VS 2013 中出现 "multiple defined"错误?

转载 作者:行者123 更新时间:2023-11-30 01:49:29 26 4
gpt4 key购买 nike

如果我在头文件内的命名空间内定义一个自由函数,并且该头文件包含在多个位置,我会得到 linker error 2005LNK1169在 VS 2013 中。

one or more multiply defined symbols found

The build failed due to multiple definitions of one or more symbols. This error is preceded by error LNK2005.

如果我在头文件中保留定义的同时使命名空间匿名,则不会发生这些链接器错误。

另一种选择是命名空间,但将自由函数的定义移动到 .cpp 文件,并将声明保留在头文件中。

为什么会出现这种行为?上面给出的 MSDN 链接不是很有帮助。

错误:定义在 header.h 命名空间内

namespace estd
{
std::wstring tolower(std::wstring val){
std::transform(val.begin(), val.end(), val.begin(), ::towlower);
return val;
}
}

没有错误 1:定义在 header.h 中的匿名命名空间内

namespace    
{
std::wstring tolower(std::wstring val){
std::transform(val.begin(), val.end(), val.begin(), ::towlower);
return val;
}
}

没有错误 2:在 header.cpp 中的命名空间内定义,在 header.h 中声明

// header.h content
#pragma once
#include <string>

namespace estd
{
std::wstring tolower(std::wstring val);
}

// header.cpp content
#include "header.h"
#include <algorithm>
namespace estd
{
std::wstring tolower(std::wstring val){
std::transform(val.begin(), val.end(), val.begin(), ::towlower);
return val;
}
}

最佳答案

每个包含标题的翻译单元都有自己的定义。将这些链接在一起将导致多个定义。在将函数定义保留在 header 中的同时避免这种情况的一种方法是声明函数 inline

namespace estd
{
inline std::wstring tolower(std::wstring val){
std::transform(val.begin(), val.end(), val.begin(), ::towlower);
return val;
}
}

关于c++ - 为什么在 header 的命名空间内定义的自由函数会导致 VS 2013 中出现 "multiple defined"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29065091/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com