首页 > 解决方案 > 为什么即使不导入编写它们的库,C 函数也能工作?

问题描述

int main()
{
    srand(time(0));
    int minimo = rand();
    int generato;

    while(1)
    {
        generato = rand();
        if(generato < minimo)
        {
            minimo = generato;
            printf("%d\n", minimo);
        }
    }
    return 0;
}

此代码在我的计算机上完美运行,无需导入任何库。我只是按照您在此处所见的方式编写了它,它编译并成功运行,没有错误。我正在使用 c11 std-GNU 编译器

标签: c

解决方案


由于 C 的历史,一些编译器仍然允许使用函数而不声明它们。当使用标识符调用函数时,会提供不带原型的函数的默认声明(未指定参数的数量和类型)返回int。如果函数确实 return int, asrandprintfdo ,并且默认参数提升后的参数与参数的实际类型匹配,则此方法有效。如果函数没有返回任何东西(有 return “type” void,就像srand那样),它也可能工作。

1990 C 标准在第 6.3.2.2 条中说:

…如果函数调用中括号内的参数列表之前的表达式仅包含一个标识符,并且如果该标识符没有可见的声明,则该标识符被隐式声明,就好像在包含函数调用的最里面的块中,声明

extern int identifier();

出现了。

这在 1999 年的 C 标准中被删除。

我正在使用 c11 std-GNU 编译器

如果您的意思是您使用的是 GCC,那么我希望它至少在其默认模式下或在-std=c11使用时发出警告。

你不应该使用这个“功能”。它的存在是为了支持旧的源代码,并且它在默认编译器设置中的接受度是有问题的。


推荐阅读