C 编程指令 #include<stdio.h> printf

Posted

技术标签:

【中文标题】C 编程指令 #include<stdio.h> printf【英文标题】:C programming directives #include<stdio.h> printf 【发布时间】:2014-01-01 17:43:03 【问题描述】:

我有那个简单的 hello world 程序。 第一行显示#include &lt;stdio.h&gt;

我用谷歌搜索它,它基本上告诉预处理器定义输入/输出函数。

第一个问题: 我读到函数的实际代码首先编译为目标文件。所以如果我说#include &lt;foo.bar&gt;自动链接那个目标文件?

第二个问题: 当我删除包含时,程序仍然有效...我的意思是 printf 语句...为什么?

【问题讨论】:

标头stdio.h 声明原型为库中定义的函数。 对于你的第二个问题,如果你没有声明你使用的函数,它通常被隐式声明为int printf();,如果你用这个声明调用 printf("foo") 你甚至可能让它工作,但是此时的行为在技术上是未定义的,因为参数的数量与 printf 的库定义不匹配 - securecoding.cert.org/confluence/display/seccode/… 【参考方案1】:

printf() 位于标准 C 库中,链接器将标准库链接到您的程序。

所以任何标准函数都不会有任何链接问题。

如果您使用gcc 编译没有#include&lt;stdio.h&gt; 的程序,您将收到警告。

【讨论】:

谢谢。所以如果我#include任何非标准库,我必须自己链接这个目标文件还是自动链接? @int80:是的,您需要使用选项-l 将这一点告诉链接器。你也确实包含了一个header(到一个库)而不是一个library已链接。 为了澄清,标准库是唯一自动链接的库(虽然有一个选项可以防止这种情况发生)。除此之外,它和其他所有的都是一样的。【参考方案2】:

在一些不包含标准库函数头文件的旧编译器中,您的代码将无法编译。

在一些现代编译器中,标准库是默认链接的。

如果未包含任何使用的库的标头,则会发出如下警告:

 [Warning] implicit declaration of function 'printf' [-Wimplicit-function-declaration]

对于非标准库函数,您必须将其与您的程序链接。不要忘记包含它的标题。

【讨论】:

处理标准库和其他库的唯一区别是标准库是自动链接的。在所有其他方面,这些库的处理方式相同。关于是否需要标头以及如果不包含所需标头会出现什么问题,标准和其他库/函数之间也没有区别。 @alk; 处理标准库和其他库的唯一区别是标准库是自动链接的。:如何将非标准库链接到不包含标头的程序? 通过告诉链接器这样做:-Lpath_to_a_non_standard_library -la_non_standard_library @alk;嗯。需要为此努力:)。如果您发现任何不相关的内容,请随时编辑:)【参考方案3】:

因为很少有编译器默认包含这些文件和库!

【讨论】:

【参考方案4】:

printf 函数是在标准 C 库中定义的,除非另有说明,否则您的编译器会自动将其链接到您的程序。头文件只有函数声明,所以删除include指令不会使函数不可用。

【讨论】:

以上是关于C 编程指令 #include<stdio.h> printf的主要内容,如果未能解决你的问题,请参考以下文章

步入C编程的第一天

Linux系统编程(文件)———CP指令判断文件大小

Linux系统编程(文件)———CP指令判断文件大小

C编程基础

C语言之控制台读取上下左右方向键指令

预处理指令