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

Cpp*_*ner 6 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
Run Code Online (Sandbox Code Playgroud)

这就是我解释它的方式:

静态变量没有外部链接,当我们编译没有'static'时,我们在每个文件中"包含"静态变量(这里是全局的),这会创建重复项,并且链接器将抛出错误,因为不允许多次声明.

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

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

Alo*_*ave 11

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

因为它打破了一个定义规则(ODR).
当您包含包含非静态变量的头文件时,变量的声明将粘贴到包含它的每个源文件中.因此,您最终在同一个翻译单元中有一个以上的变量定义,这违反了ODR,因此链接器会为您提供链接错误.

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

在头文件中声明静态变量时,会在包含头文件的每个转换单元中创建变量的副本.

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

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

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

没有永不!

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

您需要使用extern关键字.

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

filename.h

extern int gVariable;  /* Declaration */ 
Run Code Online (Sandbox Code Playgroud)

file1.cpp

#include "filename.h"  

/* Definition */ 
int gVariable = 37;    

void doSomething(void) 
{ 
    return gVariable++; 
} 
Run Code Online (Sandbox Code Playgroud)

file2.cpp

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