2017-02-27 87 views
0

我有包含各种C++项目的visual studio解决方案。为了简单起见,有两个项目。一个用于.lib,另一个用于.exe。这两个项目都使用预编译头文件stdafx.h。但预编译头文件在项目之间共享。stdafx.cpp中变量的定义

最近有人放置变量的定义里面stdafx.cpp因为它是项目之间共享我: error LNK2005: "int x" ([email protected]@3HA) already defined in stdafx.obj

所以我的问题是:它是确定把定义为预编译头?(在创建预编译头文件的cpp部分)

我猜想预编译头文件应该只包含符号声明而不包含定义。或者我错了?

+1

通常你不希望在任何*头*定义一个变量。每个包头的头文件都会提取这个定义,然后链接程序就会抛出一个合适的结果。 – user4581301

+1

我建议不要使用预编译头文件,除非构建程序需要很长时间(如分钟)。海事组织,你的程序应该是结构化的,以便一次只修改几个文件。大多数文件不应该改变,因此编译数量会减少;从而缩短构建时间。 –

+0

不要在项目之间共享预编译的标题,除非您可以保证两个项目中的项目编译设置相同并且保持相同 –

回答

2

通常,您不想在的任何标头中定义变量。

当包含标题时,在编译开始之前将其有效地粘贴到包含文件中。这意味着标题中定义的任何内容都将在包含标题的每个文件中重复。这通常编译得很好,但让链接器解决了哪个定义是真正定义的问题。

如果每个人都共享同一个x,将

extern int x; 
在头

int x; 

在适当的CPP文件。

如果每包入是有自己的私人x

static int x; 

进去的头,但我个人认为这是一个丑陋的躲闪,你应该尝试解决。

至于把标题以外的东西放到stdafx中是否合法,我真的不知道。从来没有做过。我知道这不是stdafx.h打算如何使用,你只想把库中的头文件作为stdafx.h中的项目的一部分进行修改,所以我不会这样做。

推荐阅读:Purpose of stdafx.hWhat's the use for "stdafx.h" in Visual Studio?,并且How to use stdafx.h properly?