c - "__builtin_va_list"是如何实现的?

标签 c gcc clang

我想深入研究 macOS 上 C 中函数“printf”的实现。 “printf”使用 <stdarg.h>头文件。我打开<stdarg.h>文件并找到 va_list只是一个宏。

所以,我真的很好奇 __builtin_va_list实现了吗?我知道它是特定于编译器的。我在哪里可以找到 __builtin_va_list 的定义?我应该下载clang编译器的源代码吗?

最佳答案

So, I am really curious about how the __builtin_va_list is implemented?

__builtin_va_list GCC 中实现编译器(或 Clang/LLVM 之一)。因此,您应该研究 GCC 编译器源代码以了解详细信息。

查看gcc/builtins.def & gcc/builtins.c了解更多。

我不太熟悉Clang ,它实现了相同的内置。

但是 GCC 和 Clang 都是开源或免费软件。它们是复杂的怪兽(每个都有数百万行代码),因此您可能需要多年的工作才能理解它们。

请注意 ABI你的编译器很重要。例如在 X86 psABI 中查找了解更多详情。

顺便说一句,Grady Player评论:

Pops the correct number of bytes off of the stack for each of those tokens...

不幸的是,今天的情况要复杂得多。在当前的处理器和 ABI 上 calling conventions使用processor registers传递一些论点(细节中有罪恶)。

Should I download the source code of clang compiler?

是的,而且你还需要分配几年的工作来了解细节。

几年前,我确实写了一些关于 GCC 实现的教程幻灯片和指向外部文档的链接,请参阅我的 GCC MELT documentation页面(有点烂)。

关于c - "__builtin_va_list"是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49733154/

相关文章:

c - C 超出时间限制

c - 嵌入式C Cortex-M4 : Properly handle division by big numbers?

c - 使用 fread() 挂起直到被杀死

c++ - GNU C++ 如何检查 -std=c++0x 何时生效?

android - 使用 NDK cmake 链接静态库 libm.a 或 libc.a

c++ - 如何在 clang 库中执行模板替换?

c - C 的仪器工具?

linux - 如何运行 makefile 使其不会因错误退出并继续编译剩余文件?

linux - 如何在c中制作一个 'makefile'

android studio 3.2初始构建错误(找不到testCCompiler.c文件,windows 10)