C++ C++;全局命名空间成员已定义错误
我试图使名称空间及其成员在全局范围内可用,但遇到了已定义的C++ C++;全局命名空间成员已定义错误,c++,C++,我试图使名称空间及其成员在全局范围内可用,但遇到了已定义的错误 设置.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;
错误
设置.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();
};
我正向声明设置
命名空间和成员,并使用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
错误LNK2005“类标准::基本字符串设置::设置SPATH”(?settingsPath@Settings@@3V$
基本的_string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@A)已在中定义
AmalgamService.obj Amalgam F:\Dropbox\CPP\Visual Studio项目\Amalgam\Amalgam\
main.obj 1
并对命名空间的所有成员重复此操作。Settings.h
在main.cpp
和AmalgamService.cpp
中包含Settings.cpp
。不要包括.cpp
文件。这会导致重复的定义。这也意味着.cpp
文件中的#pragma once
是无用的
您需要记住,#include
只是一个美化的复制粘贴工具。当您#include
一个文件时,该文件实际上被复制并粘贴到#include
语句的位置。因此,包含.cpp
文件意味着您将获得该.cpp
文件中定义的所有内容的多个定义
此外,在声明函数时不必使用extern
。默认情况下,函数是extern
,除非您另有说明
默认情况下,变量也是extern
,但是您需要使用extern
作为一种在不定义它们的情况下声明它们的方法:
extern int var; // declaration
int var; // definition
函数不需要这样做,因为您可以通过省略其主体来声明它们:
void func(); // declaration
void func() { } // definition
您可以多次声明内容,这就是为什么您可以在多个文件中包含头文件(如.h
,.hpp
)。但是您不允许多次定义内容,这就是为什么您不能#包括非标题源文件。请复制并将实际错误消息粘贴到问题中。您不需要extern
声明函数。无需对cpp文件进行一次编译。如果包含cpp文件,则会出现更大的问题。添加了错误消息。同时感谢您提供的#pragma once
信息。我不包括cpp文件,所以这里只有一个小问题
void func(); // declaration
void func() { } // definition