当前位置: 首页 > 面试题库 >

没有标题的C程序

孔冥夜
2023-03-14
问题内容

我用C语言编写“ hello world”程序

void main()
{ printf("Hello World"); }
// note that I haven't included any header file

程序编译时显示警告为

vikram@vikram-Studio-XPS-1645:~$ gcc hello.c 
hello.c: In function ‘main’:
hello.c:2:2: warning: incompatible implicit declaration of built-in function ‘printf’
vikram@vikram-Studio-XPS-1645:~$ ./a.out 
Hello Worldvikram@vikram-Studio-XPS-1645:~$

这怎么可能?OS如何在不包含任何标题的情况下链接库?


问题答案:

编译器使用对称为的函数的引用来构建源文件printf()而无需
知道其实际使用的参数或其返回类型是什么。生成的程序集在程序的静态数据区域中包含push字符串地址的"Hello World",后跟callprintf

将您的目标文件链接到可执行文件时,链接器会看到对它的引用printf并提供C标准库函数printf()。通过 巧合 ,你传递的参数const char*)是真正的声明兼容printf(),所以它能够正确工作。但是,请注意,printf()您的程序隐式声明的具有返回类型int(我认为),标准printf()也具有该类型。但是如果它们不同,并且您要将调用的结果分配给printf()变量,则可能会出现不确定的行为,并且可能会得到不正确的值。

长话短说:#include正确的标头可为您使用的函数获得正确的声明,因为不建议使用这种隐式声明,因为它容易出错。



 类似资料:
  • 亲爱的史塔克弗劳尔, Swift/UIKit上的任何专家都可以在下面的屏幕截图中看到我做错了什么吗? Xcode似乎找不到基于标题、样式和处理程序的UIAlertAction的方便初始值设定项,我也不知道有任何其他方式来初始化UIAlertAction。实际上,处理器不会为零。 先谢谢你了, 杰米

  • 问题内容: 我目前正在Linux上使用Tkinter和Python 2.7,我想知道是否有一种无需使用即可删除窗口边框和标题栏的方法。 我有自己的关闭按钮,并向我提出了一些我无法接受的问题: GUI始终位于顶部 无法图标化然后正确去图标化 没有键盘输入,因此无法键入字段(请参阅python tkinter overlayredirect;无法接收击键(Linux)) 我不能使用标题栏和边框。 问题

  • 问题内容: 我有一个ajax调用,其中我使用jQuery.ajax()向mvc操作发出请求。这一切都很好。但是由于某些形式具有文件控制,我将其从使用jQuery.ajax()更改为使用XMLHttpRequest通过HTML5 File API发送。 由于进行了此更改,因此MVC操作方法不再将其视为ajax请求。使用Fiddler2,我注意到它不再向请求添加“ X-Requested- With:

  • 注意:我对Configuration类做了一点修改,现在我得到了以下异常:

  • 我正在尝试使用mysql数据库用C#(我的第一个C#应用程序)开发一个小的用户-用户消息传递系统。 我知道最好的做法是使用类似EF的东西来处理数据库,但是我用“愚蠢”的方式来写这个只是为了熟悉语法。 我来自一个vb背景,所以我基本上只是转换我通常在vb中所做的,这就是为什么我不能理解为什么尽管在我的数据库中有一个匹配的行,DataReader返回时总是没有行。见下文: 上面的代码对照数据库检查用户

  • 对于这个项目,我只是在学习和练习Angular 2。我没有服务器端,正在向barchart ondemand API发出API请求。 应用程序组件: 在我的控制台中,requestData错误: