【发布时间】:2013-07-09 07:36:41
【问题描述】:
好的,
我的目录中有 3 个文件。
main.c
#include <stdio.h>
int main(int a, int b, int c)
{
aprint();
bprint();
}
交流
#include <stdio.h>
void aprint()
{
printf("hey This is a.c");
}
b.c
#include <stdio.h>
void bprint()
{
printf("This is b.c");
}
我还没有创建任何头文件。 我刚刚使用“gcc main.c a.c b.c”编译 我没有收到任何错误。我想知道发生了什么? gcc 是否只是假设在链接阶段一切都会好起来,为什么 gcc 在编译期间没有抛出错误?
【问题讨论】:
-
你当然启用了所有警告?
-
C 的类型控制不如 C++ 的类型控制严格。 gcc 将假设 aprint();表示 int aprint(void)。因此它是有效的 C。
-
@hetepeperfan 这是 C90 中未定义的行为,用于调用
aprint和bprint的类型不是函数实际具有的类型。它在 C99 及更高版本中无效,因为隐式函数声明已从 C99 中的语言中删除。当然,默认情况下 gcc 在gnu89模式下编译,然后它假定返回类型为int而无需事先声明。如果定义在同一个翻译单元中,则需要诊断消息,但由于它们在不同的翻译单元中,编译器不知道类型不兼容。