stdafx.cpp

时间:2017-02-27 20:04:12

标签: c++ visual-studio precompiled-headers

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

最近有人在stdafx.cpp内放置变量的定义,因为它在我得到的项目之间共享: error LNK2005: "int x" (?x@@3HA) already defined in stdafx.obj

所以我的问题是:是否可以将定义放入预编译的头文件中?(在cpp部分中,从中创建了预编译的头文件)

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

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?