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 <stdio.h>
。
我用谷歌搜索它,它基本上告诉预处理器定义输入/输出函数。
第一个问题:
我读到函数的实际代码首先编译为目标文件。所以如果我说#include <foo.bar>
它自动链接那个目标文件?
第二个问题:
当我删除包含时,程序仍然有效...我的意思是 printf
语句...为什么?
【问题讨论】:
标头stdio.h
声明原型为库中定义的函数。
对于你的第二个问题,如果你没有声明你使用的函数,它通常被隐式声明为int printf();
,如果你用这个声明调用 printf("foo") 你甚至可能让它工作,但是此时的行为在技术上是未定义的,因为参数的数量与 printf 的库定义不匹配 - securecoding.cert.org/confluence/display/seccode/…
【参考方案1】:
printf()
位于标准 C 库中,链接器将标准库链接到您的程序。
所以任何标准函数都不会有任何链接问题。
如果您使用gcc
编译没有#include<stdio.h>
的程序,您将收到警告。
【讨论】:
谢谢。所以如果我#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的主要内容,如果未能解决你的问题,请参考以下文章