【发布时间】:2011-11-09 18:27:23
【问题描述】:
非常抱歉。我不知道我不完整的代码附件会造成如此混乱。我很高兴看到这么多真诚的帮助。
此代码将编译:
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;
}
myadd.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
extern 声明可能包含一个初始化器(当组合 成为定义) 仅当它出现在函数之外。
我很清楚单一定义规则。
第一季度。 myadd(int,int) 在调用时使用哪个 main_stat 副本?与主副本相同,但具有不同的值(我可以测试)?还是每个函数都有自己的静态全局副本?
第二季度。这些全局静态变量是否在堆上分配了内存?我知道很多事情要实现,但是堆不是用于静态变量吗?
第三季度。我知道以下两个是有效的
extern int x; // means int x is defined elsewhere
extern int x = 3; // declared and defined
如果我们可以在 myadd 的命名空间中声明一个静态全局变量,为什么还要使用第二个?它是如何让事情变得清晰就像 aschepler 所说的那样?
【问题讨论】:
-
@Mehrdad,嗯,对不起?我不明白:x
-
@mehrdad,我看到你在那儿了。
-
@CppLearner:你不小心把问题的标题部分了
-
不确定是什么混淆。请展示“另一个文件中的主要功能”的简单示例。
-
@aschepler:他注意到,通常,
extern用于变量以表示定义和存储位于不同的 TU 中。因此,当定义和存储实际上就在同一个 decl/defn 中时,他想知道extern在变量上的语义。
标签: c++ variables memory-management extern