【发布时间】:2016-10-17 11:34:25
【问题描述】:
我一直在研究何时可以在全局范围内混合使用extern、static 和无存储说明符声明的变量。结果让我很困惑。
这是我发现的(每个段落都是一个单独的编译单元):
/* ok */
int x;
int x;
/* ok */
int f();
int f();
/* ok */
int x;
extern int x;
/* ok */
int f();
extern int f();
/* error: static declaration follows non-static declaration */
int x;
static int x;
/* ok (no warning) */
int f();
static int f();
/* ok */
extern int x;
int x;
/* ok */
extern int f();
int f();
/* ok */
extern int x;
extern int x;
/* ok */
extern int f();
extern int f();
/* error: static declaration follows non-static declaration */
extern int x;
static int x;
/* error: static declaration follows non-static declaration */
extern int f();
static int f();
/* error: non-static declaration follows static declaration */
static int x;
int x;
/* ok (no warning) */
static int f();
int f();
/* ok */
static int x;
extern int x;
/* ok */
static int f();
extern int f();
/* ok */
static int x;
static int x;
/* ok */
static int f();
static int f();
我使用gcc 和clang 得到了完全相同的结果,但我找不到什么有效和无效的模式。
这里有什么逻辑吗?
C 标准对混合使用 extern、static 和无存储说明符声明的全局声明有何规定?
【问题讨论】:
-
没有像 "no links" WRT 全局变量这样的东西。标准(6.2.2 5)对此非常清楚:" 如果函数标识符的声明没有存储类说明符,则其链接被确定为就好像它是使用存储类说明符声明的一样extern。如果对象标识符的声明具有文件范围且没有存储类说明符,则其链接是外部的。"
-
与其通过测试驱动的方法学习 C,不如找本好书读一读。如果您真的想在规范中了解它,请下载标准草案(它是免费的)并自己阅读。到目前为止,您的问题太宽泛了,IMO。
-
没有静态链接,
static和extern首先是存储类说明符。联动规范是副产品。 -
“C 标准是怎么说的” - 你为什么不自己阅读它并询问你不理解的具体方面?我们不是辅导网站。
标签: c external language-lawyer declaration linkage