stdafx.cpp 中的变量定义
Posted
技术标签:
【中文标题】stdafx.cpp 中的变量定义【英文标题】:definition of variable in stdafx.cpp 【发布时间】:2017-02-27 20:04:12 【问题描述】:我有包含各种 C++ 项目的 Visual Studio 解决方案。为简单起见,有两个项目。一个用于 .lib,另一个用于 .exe。两个项目都使用预编译头文件stdafx.h
。但是预编译的头文件是在项目之间共享的。
最近有人将变量定义放在stdafx.cpp
中,因为它在我得到的项目之间共享:
error LNK2005: "int x" (?x@@3HA) already defined in stdafx.obj
所以我的问题是:可以将定义放入预编译头文件中吗?(在创建预编译头文件的 cpp 部分)
我猜预编译的头文件应该只包含符号声明而不是定义。还是我错了?
【问题讨论】:
通常您不想在 any 标头中定义变量。该标头的每个包含器都会获取定义,然后链接器将抛出一个合适的结果。 我建议不要使用预编译头文件,除非构建程序需要很长时间(比如几分钟)。 IMO,您的程序应该结构化,以便一次只修改几个文件。大多数文件不应更改,因此编译次数较少;从而缩短构建时间。 不要在项目之间共享预编译头文件,除非您可以保证两个项目中的项目构建设置相同并且保持相同 【参考方案1】:通常您不想在 any 标头中定义变量。
当包含头文件时,它会在编译开始之前有效地粘贴到包含文件中。这意味着标题中定义的任何内容都将在每个文件中重复,包括标题。这通常编译得很好,但给链接器留下了找出哪个定义是真正定义的问题。
如果每个人都共享一个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?
【讨论】:
以上是关于stdafx.cpp 中的变量定义的主要内容,如果未能解决你的问题,请参考以下文章