为什么非静态变量不能驻留在头文件中?

时间:2011-10-21 08:45:48

标签: c++ variables static header

以例如:

// myheader.h
static int myStaticVar = 0;
// If we remove 'static' the compiler will throw linker error.

void DoStuff();

// and myheader.cpp, and main.cpp;  etc

这是我解释它的方式:

  

静态变量没有外部链接,当我们编译时   没有'静态'我们“包括”静态变量(即   global here)在每个文件中创建重复项和链接器   抛出错误,因为不允许多次声明。

有没有更好的方法来解释这个?感谢。

PS:我们假设在头文件中有静态变量(不是在谈论成员)吗?

3 个答案:

答案 0 :(得分:10)

  

为什么非静态变量不能驻留在头文件中?

因为它打破了 One Definition Rule(ODR) 当您包含包含非静态变量的头文件时,变量的声明将粘贴到包含它的每个源文件中。因此,您最终在同一 Translation Unit 中有多个变量定义,这违反了ODR,因此链接器会为您提供链接错误。

  

如何解释在头文件中声明的静态变量?

在头文件中声明静态变量时,会在包含头文件的每个 Translation Unit 中创建变量的副本。

在头文件中声明一个静态变量不会给你多个定义错误但是它没有实现你的目的是拥有一个全局变量,其值在所有访问它的文件中共享。

您可能认为,由于您使用的是全局静态变量,因此它的值将保留在不同的文件中,但如上所述,每个翻译单元都有自己的变量副本,并且它不会实现您认为您正在实现的内容。

  

我们是否假设在头文件中有静态变量(不是在谈论成员)?

不,从不!

  

如何声明和定义全局变量?

您需要使用extern关键字。

在头文件中添加变量的extern声明。标题应包含在定义变量的一个源文件和引用该变量的所有源文件中。 只有一个源文件应该定义变量。此外,只有一个头文件应该声明变量。

<强> filename.h

extern int gVariable;  /* Declaration */ 

<强> file1.cpp

#include "filename.h"  

/* Definition */ 
int gVariable = 37;    

void doSomething(void) 
{ 
    return gVariable++; 
} 

<强> file2.cpp

#include "filename.h" 
#include <stdio.h>  
void doSomethingWithGlobal(void) 
{     
    printf("Global variable: %d\n", gVariable++); 
} 

答案 1 :(得分:1)

首先,请阅读this answer类似的问题。

根据您的问题补充答案,请点击:

当您#include文件(任何文件,.h文件是常见惯例)时,几乎基本上只是将其复制粘贴到您的代码中。如果你在头文件中有非静态变量,并且你将它包含在两个源文件中,那么变量会在两个源文件中被复制粘贴,你得到的链接错误就像我在答案中解释的那样我告诉过你上面的内容。

如果要跨多个源文件共享全局变量,则应执行以下操作:

只有一个源文件中:

type global_var = default_value;

在头文件中:

extern type global_var;

因此,这样,所有源文件都会看到源文件中的某个地方会出现global_var。只有一个源文件实际包含该变量,并且在发生链接时,所有源文件都将引用global_var的一个实例

答案 2 :(得分:0)

头文件(.h)告诉你(声明)定义文件(.cpp)将做什么。

对于一个比喻 - 头文件就像告诉很多朋友你要做某事,但实际上你会做一次。