gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:38 24 4
gpt4 key购买 nike

举个例子:

// 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

我是这样解释的:

Static variables do not have external linkage, and when we compile without 'static' we are "including" the static variable (which is global here) in every file, which create duplicates and linker will throw an error since multiple declaration is not allowed.

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

PS:我们是否应该在头文件中包含静态变量(不讨论成员)?

最佳答案

Why can't a non-static variable reside in a header file?

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

How to explain static variables declared in header files?

当您在头文件中声明静态变量时,会在每个 Translation Unit 中创建该变量的拷贝。 包含头文件的地方。

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

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

Are we suppose to have static variables (not talking about members) in header file?

不,从不!

How do you declare and define global variables?

您需要使用 extern 关键字。

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

文件名.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++);
}

关于c++ - 为什么非静态变量不能驻留在头文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7847030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com