c - 为什么即使不导入编写它们的库,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 的历史,一些编译器仍然允许使用函数而不声明它们。当使用标识符调用函数时,会提供不带原型的函数的默认声明(未指定参数的数量和类型)返回int
。如果函数确实 return int
, asrand
和printf
do ,并且默认参数提升后的参数与参数的实际类型匹配,则此方法有效。如果函数没有返回任何东西(有 return “type” void
,就像srand
那样),它也可能工作。
1990 C 标准在第 6.3.2.2 条中说:
…如果函数调用中括号内的参数列表之前的表达式仅包含一个标识符,并且如果该标识符没有可见的声明,则该标识符被隐式声明,就好像在包含函数调用的最里面的块中,声明
extern int identifier();
出现了。
这在 1999 年的 C 标准中被删除。
我正在使用 c11 std-GNU 编译器
如果您的意思是您使用的是 GCC,那么我希望它至少在其默认模式下或在-std=c11
使用时发出警告。
你不应该使用这个“功能”。它的存在是为了支持旧的源代码,并且它在默认编译器设置中的接受度是有问题的。
推荐阅读
- javascript - 在 API 调用 NgRx Angular 之前检查商店
- tensorflow - 目前是否可以将 ssdlite mobilenet v2 转换为 tflite 模型?
- codenameone - 代号一:检测“caps lock”键
- c# - Xamarin.Android 应用程序如何访问复制到输出目录设置为 CopyAlways 的文件?
- powershell - 如何防止 Invoke-SQLCMD 修剪前导零
- android - 从屏幕中心开始和结束水平滚动视图
- angular - Angular 6 PHP 帖子
- php - 对连接表的结果运行 MySql 函数?
- angular - Angular6 http.get 结果到字符串
- google-analytics - 谷歌分析不显示今天的数据