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)