首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个原理性有关问题,相信知道原因的人不多

2012-11-13 
一个原理性问题,相信知道原因的人不多前提条件:变量a只有当前文件有定义,其他文件都没有定义过。1.static i

一个原理性问题,相信知道原因的人不多
前提条件:变量a只有当前文件有定义,其他文件都没有定义过。
1.
static int a = 3;
extern int a;

2.
extern int a;
int a = 3;

3.
extern int a;
static int a = 3;

问题,为什么1和2能通过编译,而3却无法通过编译呢?

[解决办法]
2就不用解释了
1,你先定义后声明 那么后面的那个声明会被忽略掉。
3.你先声明i是一个外部链接属性,但是你定义的确是一个内部链接属性的 所以自然出错。
[解决办法]
ISO/IEC 14882:2003(E)
$7.1.1/7
The linkages implied by successive declarations for a given entity shall agree. That is, within a given scope, each declaration declaring the same object name or the same overloading of a function name shall imply the same linkage. Each function in a given set of overloaded functions can have a different linkage, however. 

[Example:

...

static int b; // b has internal linkage
extern int b; // b still has internal linkage

...

extern int d; // d has external linkage
static int d; // error: inconsistent linkage

...

—end example]

按此标准条款和例子,规则大概如下:
如果第一次声明某物为内部链接,那么后续再声明为外部链接也可以,但不会改变其内部链接的属性
如果第一次声明某物为外部链接,那么后续不能再声明其为内部链接

由此看来,微软不讲究是不是第一次声明,而是总选择那个范围小的声明


热点排行