C ++全局命名空间成员已经定义了错误

时间:2017-10-29 16:24:59

标签: c++

我尝试在全局范围内创建命名空间及其成员但是我遇到了awk '{sub(/RncFunction.*=/,"")} 1' Input_file 错误。

Settings.h

already defined

Settings.cpp

#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();
};

我正在声明#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#include

main.cppAmalgamService.cpp

1 个答案:

答案 0 :(得分:0)

您似乎将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非标题源文件的原因。