【发布时间】:2013-08-26 03:29:37
【问题描述】:
我有以下 C 程序:
#include<stdio.h>
static void p(void);
static int c;
int main(int argc,char **argv) {
p();
printf("%d",c);
return 0;
}
void p(void) {
printf("From the Function P\n");
}
int c=232;
编译器gcc的输出错误是: 错误:'c' 的非静态声明遵循静态声明
当我查看 C 标准 ISO/IEC 9899:TC2 时:
6.2.2 标识符的链接
1 在不同作用域或同一作用域中多次声明的标识符可以是 通过称为链接的过程来引用相同的对象或函数。21)有 三种联系方式:外部、内部和无。
2 在构成整个程序的一组翻译单元和库中,每个 具有外部链接的特定标识符的声明表示相同的对象或 功能。在一个翻译单元内,每个标识符的声明都带有内部 链接表示相同的对象或功能。每个标识符的声明都没有 链接表示一个唯一的实体。
3 如果对象或函数的文件范围标识符的声明包含存储类 说明符静态,标识符有内部链接。22)
4 对于在一个范围内使用存储类说明符 extern 声明的标识符 该标识符的先前声明可见,23)如果先前声明指定内部或 外部链接,标识符的链接在后面的声明中与 前面声明中指定的链接。如果没有可见的先前声明,或者如果先前的声明 声明指定无链接,则标识符有外部链接。
5 如果函数标识符的声明没有存储类说明符,则它的链接 完全确定,就好像它是用存储类说明符 extern 声明的一样。如果 对象标识符的声明具有文件范围且没有存储类说明符, 它的链接是外部的。
6 以下标识符没有链接:声明为除 一个对象或一个函数;声明为函数参数的标识符;块作用域 未使用存储类说明符 extern 声明的对象的标识符。
7 如果在翻译单元内,相同的标识符同时出现在内部和外部 链接,行为未定义。
21) 不同标识符之间没有联系。 22) 函数声明只能在文件范围内包含存储类说明符 static;看 6.7.1.
Q.1 我无法理解规则 4 和 5?顺便说一句,链接的确定与使用存储类说明符 extern 完全一样。 和 链接是外部的
第二季度。为什么会出现这个错误,因为我可以从规则 5 中推断出 c 具有静态 decl。其次是外部decl。所以最后的 decl.shud 也是静态的。? 如果有人不厌其烦地从一开始就解释所有规则,我会很感激。或者建议我一个清楚地解释所有规则的链接。*
注意:感谢任何建议正确编辑此问题,因为它可能重复我问了这个问题,因为我无法理解提前发布在此站点上的类似问题的答案。
【问题讨论】:
标签: c compiler-errors linkage