Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;全局命名空间成员已定义错误_C++ - Fatal编程技术网

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