中一个奇怪问题

时间:2021-02-24 20:02:11
在"Name Control"一章中有这样一个例子:

“In one file you have at the global scope:

//1.cpp
extern int y;
int x = y + 1;
...

and in a second file you have at the global scope:

//2.cpp
extern int x;
int y = x + 1;
...

For all static objects, the linking-loading mechanism guarantees a static initialization to zero before the dynamic initialization specified by the programmer takes place. if the files are initialized in the order they are shown above, y begins as statically initialized to zero, so x becomes one,and y is dynamically initialized to two. However, if the files are initialized in the opposite order, x is statically initialized to zero, y is dynamically initialized to one, and x then becomes two.”

他通过这个说明静态初始化相依性的问题。 但我觉得上述两个文件连接时应该有问题。 因为 extern <typename> <identifier> 是纯声明, 不是定义。单个文件时:

// example.cpp
#include<iostream>
extern int i;
int main() {std::cout << i << std::endl; }

i不会自动初始化为0, 连接时自然出现 "unresolved simbol 'i' "错误。

那上述例子的两个文件中的x 或 y必然有一个初始化了, extern失效了吗? IDE是如何处理处理的?
谢谢!

9 个解决方案

#1


int x = y + 1;

int y = x + 1;
是定义啊!

#2


不是已经说得很清楚了嘛.
extern是声明,但的确在别的文件里定义了,所以编译不会有问题。

extern <typename> <identifier>的作用就是告诉编译器,identifier这个已经定义了,在别的地方。

#3


是。编译没错。但连接或运行时应该会有问题。
//1.cpp
extern int y;
int x = y + 1;
...

//2.cpp
extern int x;
int y = x + 1;
...

编译1.cpp时 把y处理为外部变量。 编译2.cpp时 把x处理为外部变量。 在进入main函数前 int x = y + 1 和 int y = x + 1都要执行。 在定义x时要寻址y, 而y又是根据x定义的, 不循环了吗。 从结果来看 必然是在 "extern int x"处或“extern int y"处 初始化了。

#4


对阿,这个就需要编译器去做处理了。
从<Thinking in C++>作者的意思来看,遇到这种情况就把第一个编译的文件中用到的y赋值为0

#5


不是我说*没能耐,这个世道是最多骗子的时代,比历史上任何一个时代都多骗子,各位小心自保才是。政治就是政治,在中国,政治被北方人和东部沿海地区的人掌握着,说是西部大开发,只有雷声不见雨下,实为欺骗西部地区人民的卑劣手段尔,可悲呼!南方人和西部地区的人只有挨穷的份,不在沉默中爆发,就在沉默中死亡,一场好戏正在上演。

#6


ShanChunZhenZi(山村贞子) 这个破人是要*了,怎么每个帖都有他的狂言,论坛早完被封

#7


先给X,Y分配空间,然后给他们初始化相应的值。分配的时候不会有依赖性的问题,初始化的时候,如果x依赖于y,y又依赖于x,在编译器看来是其实是x依赖于y的地址所存储的值,y依赖于x的地址所存储的值。

#8


可能他们初始化的时候都已经被赋值了,在执行到int x = y + 1;的时候若Y还没有改变,则以默认值进行操作,若已经做完int y = x + 1;操作,则以现在的Y值操作
这只是我的想法,可能不正确

#9


这本来就是个反例嘛,让我们要避免这样写代码, 这样的代码初始化是跟编译器有关的

#1


int x = y + 1;

int y = x + 1;
是定义啊!

#2


不是已经说得很清楚了嘛.
extern是声明,但的确在别的文件里定义了,所以编译不会有问题。

extern <typename> <identifier>的作用就是告诉编译器,identifier这个已经定义了,在别的地方。

#3


是。编译没错。但连接或运行时应该会有问题。
//1.cpp
extern int y;
int x = y + 1;
...

//2.cpp
extern int x;
int y = x + 1;
...

编译1.cpp时 把y处理为外部变量。 编译2.cpp时 把x处理为外部变量。 在进入main函数前 int x = y + 1 和 int y = x + 1都要执行。 在定义x时要寻址y, 而y又是根据x定义的, 不循环了吗。 从结果来看 必然是在 "extern int x"处或“extern int y"处 初始化了。

#4


对阿,这个就需要编译器去做处理了。
从<Thinking in C++>作者的意思来看,遇到这种情况就把第一个编译的文件中用到的y赋值为0

#5


不是我说*没能耐,这个世道是最多骗子的时代,比历史上任何一个时代都多骗子,各位小心自保才是。政治就是政治,在中国,政治被北方人和东部沿海地区的人掌握着,说是西部大开发,只有雷声不见雨下,实为欺骗西部地区人民的卑劣手段尔,可悲呼!南方人和西部地区的人只有挨穷的份,不在沉默中爆发,就在沉默中死亡,一场好戏正在上演。

#6


ShanChunZhenZi(山村贞子) 这个破人是要*了,怎么每个帖都有他的狂言,论坛早完被封

#7


先给X,Y分配空间,然后给他们初始化相应的值。分配的时候不会有依赖性的问题,初始化的时候,如果x依赖于y,y又依赖于x,在编译器看来是其实是x依赖于y的地址所存储的值,y依赖于x的地址所存储的值。

#8


可能他们初始化的时候都已经被赋值了,在执行到int x = y + 1;的时候若Y还没有改变,则以默认值进行操作,若已经做完int y = x + 1;操作,则以现在的Y值操作
这只是我的想法,可能不正确

#9


这本来就是个反例嘛,让我们要避免这样写代码, 这样的代码初始化是跟编译器有关的