C++ 多次定义的符号
在以下情况下,我如何找出我的错误所在 在我的项目中,我有一个名为“appconstants.h”的头文件。 它包含一个全局变量: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
#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;