从另一个源文件C ++访问变量?

时间:2015-04-11 13:11:52

标签: c++ header-files

我试图避免上课,所以请记住这一点。

我想知道如何从另一个.cpp文件访问变量。

无论出于何种原因,当我尝试将变量包含在我的' codeReferences.h'头文件我得到LNK 2005错误。所以我想知道没有在全局使用的头文件中定义它(导致错误)如何从另一个.cpp文件中访问变量。

所有答案都表示赞赏。

3 个答案:

答案 0 :(得分:4)

LNK2005表示您对同一个符号有多个定义。

您需要了解声明和定义之间的区别:

  • 当您声明一个变量时,您只告诉编译器有一个名称(=符号)和该符号的类型。
  • 当您为变量指定具体值或为其提供实现时,您可以定义它(例如,在函数的情况下)。

您可以为符号设置任意数量的声明,但只能有一个定义。也请参阅此主题:What exactly is One Definition Rule in C++?

如果要在多个.cpp文件中使用相同的符号(引用同一个对象),则需要在头文件中使用extern关键字:

示例:

/** header.h **/
extern int i;

您可以在任意数量的.cpp文件中包含此标头,以引入符号i。您必须仅在一个.cpp中指定i的定义:

/** code.cpp **/
#include "header.h"
int i; // this is a definition, even if you do not initialize here.

答案 1 :(得分:1)

大概是“.cpp文件”,你的意思是“翻译单位”。

神圣的C ++标准无关心代码在文件中的分布方式,并且没有头文件与.cpp的概念。

要在一个翻译单元中定义并在另一个翻译单元中访问的变量必须具有extern链接。这是名称空间级别非const变量的默认值。但是,一个普通的声明也会定义变量,然后你会遇到One Definition Rule,它通常需要每个东西的单个定义

解决方案是写例如。

extern int n_oranges;

在您只想访问变量的翻译单元中。在没有初始化程序的情况下明确提及extern链接会使其成为纯声明

你可以根据需要拥有尽可能多的纯粹声明。

最好将这样的声明放在头文件中,以避免冗余的多个可能不完全匹配的声明。请注意,在头文件中,它将作为每个相关翻译单元文本的一部分包含在内。 C ++编译器并不关心它来自哪里,只是它就在那里。


相关标准:

C ++11§3.1/ 2:
  

声明是一个定义,除非它声明一个函数而没有指定函数的主体(8.4),它   包含extern说明符(7.1.1)或连接规范(7.5),既不包含初始化程序也不包含函数体,它在类定义(9.2,9.4)中声明了一个静态数据成员,它是一个类名声明(9.1),它是一个 opaque-enum-declaration (7.2),它是一个 template-parameter (14.1),它是一个参数声明(8.3.5)   函数声明符不是函数定义声明符,或者是typedef声明(7.1.3),    alias-declaration (7.1.3), using-declaration (7.3.3), static_assert-declaration (第7条), 属性声明(第7条),空声明(第7条)或使用指令(7.3.4)。

答案 2 :(得分:0)

现在首先要注意的是,你不要多次定义事物。

其次,您至少应该阅读有关c ++编程语言基础知识的教程。

我知道我可能听起来很苛刻但是一个简单的教程可以帮助你比现在更好地理解语言。

为了能够从不同的源文件访问变量,您可以使用其扩展名包含它们。为了更好的实践,大多数开发人员使用标头来定义代码,以及实际使其能够在没有大量文件的情况下轻松调试和更改内容的源代码。

相关问题