为什么C函数即使不导入它们编写的库也能工作?
int main()
{
srand(time(0));
int minimo = rand();
int generato;
while(1)
{
generato = rand();
if(generato < minimo)
{
minimo = generato;
printf("%dn", minimo);
}
}
return 0;
}
这段代码在我的电脑上完美运行,无需导入任何库。我只是按照你在这里看到的方式写了它,它编译并成功运行,没有错误。我正在使用 c11 std-GNU 编译器
回答
由于 C 的历史,一些编译器仍然允许使用函数而不声明它们。当使用标识符调用函数时,会提供一个没有原型的函数的默认声明(未指定参数的数量和类型)返回int。如果函数确实 return int、 asrand和printfdo ,并且默认参数提升后的参数与参数的实际类型匹配,则此方法有效。如果函数不返回任何内容(已返回“type” void,同样srand如此),它也可能工作。
1990 C 标准在第 6.3.2.2 条中说:
… 如果在函数调用中括号中的参数列表之前的表达式仅包含一个标识符,并且如果此标识符没有可见的声明,则该标识符被隐式声明,就像在包含函数调用的最里面的块中一样,声明
extern int identifier();出现了。
这在 1999 C 标准中被删除了。
我正在使用 c11 std-GNU 编译器
如果您的意思是您正在使用 GCC,那么我希望它至少在默认模式下或在-std=c11使用时发出警告。
你不应该使用这个“功能”。它的存在是为了支持旧的源代码,它在默认编译器设置中的接受度是有问题的。