【发布时间】:2020-08-31 00:39:37
【问题描述】:
下面是我的代码:
//main.c
//I'm not using header file here,I know it is bad practice, it is just for demo purpose.
int main()
{
func();
return 0;
}
//test.c
void func()
{
...
}
我们可以看到上面的代码可以编译,可以通过链接器链接,但同样的事情不适用于变量:
//main.c
int main()
{
sum += 1;
return 0;
}
//test.c
int sum = 2020;
那么这段代码将无法编译,无法链接,我们必须在main.c中的main函数前添加extern int sum;。
但是为什么我们不需要在main.c 中添加extern 为:
//main.c
extern void func(); //or `void func();` since functions are by default external
// without above line, it still compile
int main()
{
func();
return 0;
}
这里是不是有点不一致?
注意:通过说“函数默认是外部的。”,我的理解是:我们可以在不输入 extern 的情况下保存一些按键,所以 void func(); == extern void func();,但是我们还是需要在main.c的main函数前加上void func();,不是吗?
【问题讨论】:
-
“我们可以看到上面的代码编译了”你确定吗?在我看来
func()没有在main.c任何地方声明。 -
在您的情况下,隐式函数声明 (
int func(void)) 不 与实际函数 (void func(void)) 匹配,因此您确实有 未定义的行为 i>. -
int func(void)不在您的代码中,因为它是隐式。这就是隐式的意思。你没有明确声明它,所以编译器为你做了。 -
正如我所说,它是隐式声明的。编译器会为您创建该声明。
-
@amjad 函数和变量是两个不同的东西,没有理由期望一些任意的“一致性”