一个原理性问题,相信知道原因的人不多
前提条件:变量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]
按此标准条款和例子,规则大概如下:
如果第一次声明某物为内部链接,那么后续再声明为外部链接也可以,但不会改变其内部链接的属性
如果第一次声明某物为外部链接,那么后续不能再声明其为内部链接
由此看来,微软不讲究是不是第一次声明,而是总选择那个范围小的声明