Jos Horsmeier 写道
> 在文章 <....> 中,Larry Jones 写道
>|在文章 <....> 中,David Alan Boles 写道
>|> static void dummy(int, int, int *);
>|> void dummy(int a, int b, int *c) { *c = a + b; }
>|>
>|> 查阅 Steele 的书,似乎说这个词静态必须
>|> 在两个地方都出现,但这一点并不清楚。[...]
>|
>|他说你必须要有静态在两个地方。[...]
>
> 不,如果第一个声明将对象声明为静态对象
> (无外部链接),后续的声明(和定义)可以
> 省略 `static` 关键字。反之则会导致
> 编译器警告……
Jos Horsmeier 现在开始谈论对象,而 Larry Jones 和 David Alan Boles 之前在讨论函数。不幸的是,函数和对象的链接处理方式不同。
Larry 所认为适用于函数的规则适用于对象,而 Jos 为对象陈述的规则适用于函数。
示例
/* object */ /* function */ int o1; int f1(); /* external linkage */ static int o2; static int f2(); /* internal linkage */ static int o3; static int f3(); /* internal linkage */ static int o1; static int f1(); /* ERROR, both have external linkage */ int o2; /* ERROR, o2 has internal linkage */ int f2(); /* OK, picks up internal linkage */ extern int o3; extern int f3(); /* OK, both pick up internal linkage */
区别在于第二点(case (2));函数即使没有 "extern" 也能继承之前的链接,而对象则不能。
Jutta Degener