gpt4 book ai didi

c++ - 什么情况下可以在定义中使用extern变量?

转载 作者:太空狗 更新时间:2023-10-29 23:25:00 24 4
gpt4 key购买 nike

非常非常抱歉。我不知道我不完整的代码附件会造成这样的困惑。很高兴看到这么多真诚的帮助。

此代码将编译:

int myadd(int, int);
static int main_stat = 5;

int main()
{
int i, j;
main_stat = 13;
j = myadd(-1,7);
i = main_stat;

cout << j << i; // 3 and 13
return 0;

}

我的添加.cpp

extern int main_stat = -3;
int myadd(int x,int y)
{
int t = main_stat;
t = x + y;
y = t +main_stat;
return y; // will return 3
}

参见我定义和外部链接 main_stat。为什么这是合法的?我以为你只能链接而不能定义。

myadd 函数调用的栈帧中是否分配了存储空间?我相信全局静态是在堆上分配的,对吧?


编辑

对不起,但我想这次我会缩小我的问题范围:

来自 C++ Primer 4ed

An extern declaration may include an initializer (when combined becomes definition) only if it appears outside a function.

我清楚一定义规则。

Q1。调用 myadd(int,int) 时使用的是 main_stat 的哪个拷贝?与主拷贝相同,但具有不同的值(我可以测试)?还是每个函数都有自己的静态全局拷贝?

Q2。是否为这些全局静态变量在堆上分配了内存?我知道很多事情都取决于实现,但是堆不是用于静态变量吗?

Q3。我知道以下两个是有效的

extern int x;    // means int x is defined elsewhere
extern int x = 3; // declared and defined

如果我们可以在 myadd 的命名空间中声明一个静态全局变量,为什么我们需要第二个?它如何像 aschepler 所说的那样让事情变得清晰

最佳答案

所有带有初始值设定项的变量声明也是定义;这是一个压倒一切的规则。不论extern .甚至还有您需要 extern 的情况根据定义:你只能使用具有外部链接的变量实例化模板。和 const变量默认有内部链接,所以你需要像这样的东西:

extern int const i = 42;

如果你想用它来实例化一个template<int const*> .

关于c++ - 什么情况下可以在定义中使用extern变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8069717/

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