C++ 多次定义的符号

C++ 多次定义的符号,c++,visual-studio-2017,C++,Visual Studio 2017,在以下情况下,我如何找出我的错误所在 在我的项目中,我有一个名为“appconstants.h”的头文件。 它包含一个全局变量: #include <string> using namespace std; extern int g_iSpeakerLCID = 1031; 现在,当我在同一项目的另一个cpp文件中声明相同的头时,我得到了编译器错误 "int g_iSpeakerLCID (?g_iSpeakerLCID@@3HA) is

在以下情况下,我如何找出我的错误所在

在我的项目中,我有一个名为“appconstants.h”的头文件。 它包含一个全局变量:

#include <string>
using namespace std;
extern int                      g_iSpeakerLCID = 1031;
现在,当我在同一项目的另一个cpp文件中声明相同的头时,我得到了编译器错误

"int g_iSpeakerLCID (?g_iSpeakerLCID@@3HA) is already defined in compiler.obj.

这里发生了什么或者我应该检查什么?

不要在
extern
声明中初始化-仅在定义点初始化。您的
extern
声明应仅为:

extern int g_iSpeakerLCID;

尽管有复选标记

您可以在头文件中完成这一切。将
extern
替换为
inline
。请确保属性是用C/C+++语言-C++语言标准-> ISO C++ 17设置的。
#pragma once
#include <string>
inline int g_iSpeakerLCID = 1031;
#pragma一次
#包括
内联int g_ispeakerCID=1031;
使用名称空间std放置
是一个非常糟糕的主意(通常是生产代码中的任何位置。)


此外,最好将
g_ispeakercd
放在一个名称空间中,而不是让它在全局名称空间中来回移动。

我在整个项目中都使用这个外部int,它永远不会改变,应该硬编码。每当我想更改它时,我只在appconstants.h中更改它(并且只在编译时更改)。做我想做的事的正确方法是什么?我的应用程序有多个版本,每个版本都有不同的值。在编译之前,我使用外部编辑器使用所需的值(如“1031”)重新编写appconstants.h。我用以下解释补充了您的答案:我的意思是@LuchianGrigore
#pragma once
#include <string>
inline int g_iSpeakerLCID = 1031;