我有以下 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 如果对象或函数的文件范围标识符的声明包含存储类说明符 static,则该标识符具有内部链接。22)
4 对于在一个范围内 使用存储类说明符 extern声明的标识符,该标识符的先前声明是可见的,23) 如果先前的声明指定了内部或外部链接,则后面声明的标识符的链接是相同的如先前声明中指定的链接。如果前面的声明不可见,或者前面的声明没有指定链接,则标识符具有外部链接。
5 如果函数标识符的声明没有存储类说明符,则它的链接将完全确定,就好像它是使用存储类说明符 extern 声明的一样。如果对象标识符的声明具有文件范围且没有存储类说明符,则其链接是 external。
6 以下标识符没有链接: 声明为对象或函数以外的任何东西的标识符;声明为函数参数的标识符;没有存储类说明符 extern 声明的对象的块范围标识符。
7 如果在翻译单元内,相同的标识符同时出现在内部和外部链接中,则行为未定义。
21) 不同标识符之间没有联系。22) 函数声明只能在文件范围内包含存储类说明符 static;见 6.7.1。
Q.1 我无法理解规则 4 和 5?顺便说一句,链接有什么区别,就好像它是用存储类说明符 extern 声明的一样。并且链接是外部的
Q2。为什么会出现这个错误,因为我可以从规则 5 中推断出 c 具有静态 decl。其次是外部decl。所以最后的 decl.shud 也是静态的。?如果有人不厌其烦地从一开始就解释所有规则,我会很感激......或者建议我一个清楚地解释所有规则的链接。*
注意:谢谢任何关于正确编辑这个问题的建议,因为它可能是重复的我问了这个问题,因为我无法理解提前发布在这个网站上的类似问题的答案。