我尝试在全局范围内创建命名空间及其成员但是我遇到了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.cpp
为AmalgamService.cpp
答案 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
非标题源文件的原因。