我有visual studio解决方案,其中包含各种C ++项目。为简单起见,有两个项目。一个用于.lib,另一个用于.exe。两个项目都使用预编译头stdafx.h
。但预编译的头文件是在项目之间共享的。
最近有人在stdafx.cpp
内放置变量的定义,因为它在我得到的项目之间共享:
error LNK2005: "int x" (?x@@3HA) already defined in stdafx.obj
所以我的问题是:是否可以将定义放入预编译的头文件中?(在cpp部分中,从中创建了预编译的头文件)
我猜想预编译头应该只包含符号的声明而不是定义。或者我错了吗?
答案 0 :(得分:2)
通常,您不想在任何标头中定义变量。
当包含标题时,它会在编译开始之前有效地粘贴到包含文件中。这意味着标题中定义的任何内容都将在包括标题的每个文件中重复。这通常编译得很好,但让链接器遇到了确定哪个定义是真正定义的问题。
如果每个人都要分享一个x
,请放置
extern int x;
在标题中
int x;
在适当的cpp文件中。
如果每个包含者都拥有自己的私人x
static int x;
进入标题,但我个人认为这是一个丑陋的闪避,你应该尝试解决。
至于将你想要预编译的标题以外的东西放到stdafx中是否合法,我老实说不知道。从来没有做过。我知道它不是如何使用stdafx.h,你只想把来自库中的标题放在stdafx.h中作为项目的一部分不被修改,所以我不会这样做做到这一点。
推荐阅读:Purpose of stdafx.h,What's the use for "stdafx.h" in Visual Studio?和How to use stdafx.h properly?