gpt4 book ai didi

c++ - C++全局 namespace 成员已定义错误

转载 作者:行者123 更新时间:2023-12-02 10:24:41 25 4
gpt4 key购买 nike

我正在尝试使 namespace 及其成员在全局范围内可用,但是我遇到了already defined错误。

Settings.h

#pragma once
#include "boost/property_tree/json_parser.hpp"
#include <string>

using json = boost::property_tree::ptree;
namespace Settings {

extern std::string settingsPath;
extern json settings;

extern void init();
extern void readSettings();
extern void writeSettings();
};

Settings.cpp
#pragma once

#include "Settings.h"

using json = boost::property_tree::ptree;

namespace Settings {

void init() {

}

void readSettings() {

}

void writeSettings() {

}
};

我正声明 Settings命名空间和成员,并使用 extern。我不知道我在做什么错。请有人在这里指出错误。

谢谢

编辑:实际错误消息:
Error   LNK2005 "class std::basic_string<char,struct std::char_traits<char>,class 
std::allocator<char> > Settings::settingsPath" (?settingsPath@Settings@@3V?$
basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A) already defined in
AmalgamService.obj Amalgam F:\Dropbox\CPP\Visual Studio Projects\Amalgam\Amalgam\
main.obj 1

并重复命名空间的所有成员。 Settings.h#includemain.cpp中的 AmalgamService.cpp

最佳答案

您似乎在另一个文件中包含了Settings.cpp。不包括.cpp文件。这导致重复的定义。这也意味着#pragma once文件中的.cpp是无用的。

您需要记住,#include只是一个出色的复制和粘贴工具。当您对文件进行#include时,该文件实际上就是被复制并粘贴到#include语句的位置。因此,包括一个.cpp文件意味着您将获得对该.cpp文件中定义的所有内容的多个定义。

此外,在声明函数时不必使用extern。除非另有说明,否则函数默认为extern

默认情况下,变量也是extern,但是您需要使用extern来声明它们而不定义它们:

extern int var; // declaration
int var; // definition

函数不需要它,因为您可以通过省略它们的主体来声明它们:
void func(); // declaration
void func() { } // definition

您可以多次声明内容,这就是为什么您可以在多个文件中使用 #include头文件(例如 .h.hpp)的原因。但是不允许您多次定义事物,这就是为什么您不能 #include非 header 源文件。

关于c++ - C++全局 namespace 成员已定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47002506/

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