发件人:Jutta Degener
新闻组:comp.lang.c
主题:Re: 函数的 static 声明
日期:1993 年 10 月 5 日 09:09:10 GMT
消息 ID:<28rdjm$74r@news.cs.tu-berlin.de>

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