这里我有两个文件。在第一个文件中,我在文件范围内声明externdemo1.c
并externdemo2.c
初始化了一个字符数组arr
。但是我在第二个文件中声明了它,externdemo2.c
没有extern
关键字,并在函数中使用它display()
。这是我由此引起的困惑。请回答这三个:
//File No.1--externdemo1.c
#include<stdio.h>
#include "externdemo2.c"
extern int display();
char arr[3]={'3','4','7'};
//extern char arr[3]={'3','4','7'};
//extern int main()
int main()
{
printf("%d",display());
}
//File No.2--externdemo2.c
char arr[3];
int display()
{
return sizeof(arr);
}
1)为什么即使我在arr
没有extern
关键字 in的情况下声明程序也能正常编译externdemo2.c
?我读过函数的默认链接是外部的,但我不确定变量是否也是如此。我只知道全局变量有extern
存储班级。
2)extern storage class
和之间的严格区别是什么extern linkage
。我非常需要澄清这一点。在第一个文件中,我定义了数组arr
,我没有使用关键字extern
,但我知道它默认有extern storage
类。但是在第二个文件,是不是有任何默认extern
的,存储类或链接,关于全局变量arr
,即在externdemo2.c
?
3)检查第一个文件中注释掉的行。只是externdemo1.c
为了测试它,我使用了该行extern char arr[3]={'3','4','7'};
。但是它给出了错误。'arr' initialized and declared 'extern'
这个错误是什么意思?我还提到了一个注释行extern int main()
,但它工作正常,没有错误或警告。那么为什么我们可以使用extern
一个函数,即使一个函数是extern
默认的,而不是一个变量,就像arr
这里?
请花一些时间来帮我解决这个问题。它会清除我对整个事情的大部分挥之不去的疑虑。如果你能回答所有 3 位1)、2) 和 3),extern
这将是巨大的帮助。Especially 3) is eating my brains out