c++ - stdafx.cpp 中变量的定义

标签 c++ visual-studio precompiled-headers

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

最近有人在 stdafx.cpp 中放置了变量的定义,因为它在项目之间共享,所以我得到: 错误 LNK2005:“int x”(?x@@3HA) 已在 stdafx.obj 中定义

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

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

最佳答案

通常您不想在任何 header 中定义变量。

当包含头文件时,它会在编译开始前有效地粘贴到包含文件中。这意味着 header 中定义的任何内容都将在包括 header 在内的每个文件中重复。这通常编译得很好,但给链接器留下了确定哪个定义是真正定义的问题。

如果每个人都共享一个x,放置

extern int x;

在标题和

int x; 

在适当的 cpp 文件中。

如果每个包含器都有自己的私有(private)x

static int x;

出现在标题中,但我个人认为这是一种丑陋的躲避,您应该尝试解决。

至于将您想要预编译的 header 以外的内容放入 stdafx 中是否合法,老实说我不知道​​。从来没有做过。我知道这不是 stdafx.h 的用途,您只想将不会作为项目一部分修改的库中的 header 放入 stdafx.h,所以我不会这样做。

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

关于c++ - stdafx.cpp 中变量的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42494756/

相关文章:

c++ - TCS MockVita 2019 第二轮问题 : Hop Game

c# - 编译时在输出窗口中查看所有命令行

c++ - 重建而不重新编译预编译头文件

c++ 我可以将 std::unique_ptr 与依赖注入(inject)一起使用吗?

c++ - 如何在不引起递归的情况下使模板特化继承泛型基类?

c++ - 是什么导致 MS Visual Studio 无法识别构建错误?

c++ - 在 GCC 中,是否可以从其他 header 中包含预编译 header ?

objective-c - 启用模块的 Prefix.pch?

python - 使用 pybind11 或 Python C API 编译和执行 AST

visual-studio - Visual Studio 删除未使用的 Nuget 依赖项