Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C '原则;printf';_C_Gcc_C Preprocessor - Fatal编程技术网

C '原则;printf';

C '原则;printf';,c,gcc,c-preprocessor,C,Gcc,C Preprocessor,我想知道的是编译器和程序是如何工作的 例如,在“你好,世界!”比如说,hello.c,大家都知道是这样的: (使用GNU gcc) 你好,世界 我刚刚问了一个问题,printf,一个最简单和熟悉的函数,是如何定义或使用的 为了自己找到答案,我发现整个头文件都包含在stdio.h中,包含在included one中,包含在included one中。stdio.h中包含将近80个头文件。我查找每个文件,无论它是否包含“printf”一词。有3个头文件 stdio.h(本身) 位/stdio2.h

我想知道的是编译器和程序是如何工作的

例如,在“你好,世界!”比如说,hello.c,大家都知道是这样的: (使用GNU gcc)

你好,世界

我刚刚问了一个问题,
printf
,一个最简单和熟悉的函数,是如何定义或使用的

为了自己找到答案,我发现整个头文件都包含在stdio.h中,包含在included one中,包含在included one中。stdio.h中包含将近80个头文件。我查找每个文件,无论它是否包含“printf”一词。有3个头文件

stdio.h(本身)

位/stdio2.h

bits/stdio ldbl.h

我不完全了解预处理器语法,但我很确定这些文件中的文本不足以定义
printf
函数。例如,在stdio.h中,printf大致如下所示:

...
namespace std{
...
extern int printf (const char *__restrict__format, ...);
...
}
...
我知道它说的是语法和声明类型,但我认为它不是
printf
的定义或构建

因此,我认为有一些深层次的东西可以回答我的问题,我希望你们中的一些人有一个

让我们具体地限制一下(而不是C++)

printf
是一个。您可以使用定义自己的变量函数

printf
也是托管C99中的标准函数。当您有一个
#include
时,编译器可以专门对其进行优化。他正在这样做。看

顺便说一句,C标准还定义了

最后,给出了该方法的实现。尤其是和。您可以研究它们的
printf
实现(对于musl-libc:请参阅文件then)

您可以研究生成的汇编程序代码
hello.s
(使用一些编辑器或寻呼机查看内部)由

 gcc -Wall -O -fverbose-asm -S hello.c
您是正确的,在头文件中找到的声明只是一个转发声明

它包含函数签名,这是编译器调用函数所需的一切。调用约定、每个参数的类型(以便它可以对该类型执行隐式转换),等等

编译过程中根本不涉及实际的定义。而是由C标准库提供,称为libc.a或msvcrt.lib。链接器的工作是确保代码中的函数调用(由编译器转换为调用指令)使用库函数实现的正确地址


要查看实现的源代码,您需要找出您正在使用的运行库并下载其源代码。Visual C++的付费版本附带CRT源代码,它是Windows的GCC编译器的明文版本所使用的运行时。在Linux上,您需要下载源代码。对于cygwin,请查看。嵌入式设备通常用于某些特殊环境,C库可能是封闭源代码的,尽管这确实会妨碍调试,因此即使许可证有限制,大多数时候源代码都是可用的。

头文件通常包含functio9n声明,而不是定义。函数的定义将放在plarform的标准C库中[例如,在linux的情况下是glibc]。你必须下载并分析这方面的源代码


为了便于参考,您可以在
arch/x86/boot/printf.c
内核代码[3.17]中参考
printf
的源代码。为了了解
printf()

的实现逻辑背后的想法,我认为这里没有什么问题。你是在问定义在哪里?它在图书馆里,你可能有也可能没有它的来源;你可以看到它。如果你正在寻找
printf
的源代码,你的问题是这个问题的重复:否则我不确定我是否理解你到底在寻找什么。printf的“主要”(原则?)?你这是什么意思?很确定他使用的不是内核版本,而是libc版本。当然,这不是非内核程序使用的定义。@BenVoigt正在编辑我的答案。非常感谢。
 gcc -Wall -O -fverbose-asm -S hello.c