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 中的变量定义的主要内容,如果未能解决你的问题,请参考以下文章

C#中的“定义字符串变量”是啥意思。

MySql中的变量定义

在JMeter中的另一个用户定义变量中使用用户定义变量的值

解释啥是全局变量,如何定义

javascript中的变量定义

Java语言中的定义变量构造函数