我很想知道printf函数里面有什么。在terminal或cmd中是否有命令可以获取该函数的源代码?
printf
i1icjdpr1#
标准库函数的确切源代码在不同的实现中会有所不同-也就是说,*printf家族的源代码对于gcc、LLVM、Visual Studio编译器等会有所不同。话虽如此,GNU C库(glibc)的源代码可以在here中找到。同样,这只是许多不同实现中的一个。
*printf
dgjrabp22#
这大概是它包含的内容:
#include <stdarg.h> void minprintf(char *fmt,...) { va_list ap; char *p, *sval; int ival; double dval; va_start(ap, fmt); for(p = fmt; *p; p++) { if(*p != '%') { putchar(*p); continue; } switch (*++p) { case 'd': ival = va_arg(ap, int); printf("%d", ival ); break; case 'f': dval = va_arg(ap, double); printf("%f", dval); break; case 's': for(sval = va_arg(ap, char *); *sval; sval++) putchar(*sval); break; default: putchar(*p); break; } } va_end(ap); }
一个例子取自《C语言》一书。这本书是由Brian Kernighan和Dennis里奇写的。你会在那里找到C语言和其他标准函数的详细解释。
zfciruhq3#
您可以简单地右键单击printf并查看描述它的完整代码。
_Check_return_opt_ _CRT_STDIO_INLINE int __CRTDECL printf( _In_z_ _Printf_format_string_ char const* const _Format, ...) #if defined _NO_CRT_STDIO_INLINE ; #else { int _Result; va_list _ArgList; __crt_va_start(_ArgList, _Format); _Result = _vfprintf_l(stdout, _Format, NULL, _ArgList); __crt_va_end(_ArgList); return _Result; } #endif
以下是在Visual Studio中如何执行此操作:
9rygscc14#
它被称为逆向工程,你可以使用像IDA和Ghidra这样的工具。你可以做的另一件事是在互联网上寻找该函数实现的开源版本,比如从Linux,例如here。
IDA
Ghidra
Linux
q43xntqr5#
大多数时候,你看到你必须在你的c程序中包含一些头文件,以便使用一些函数,例如,任何时候你想使用printf函数,你需要使用stdio. h。所以在stdio. h中,你可以看到一个已经定义的函数,称为printf。注意,在一些头文件中可能包含其他文件,所以如果你不能看到一个函数的完整定义,看看其他的头文件中已经定义的,但是你曾经在你的c程序中使用过的每个函数都已经在linux中的这些目录中的一个头文件中定义了:/usr/包含/usr/包含/Linux
aij0ehis6#
如果你对一个好的示例源代码感兴趣,请参考链接https://opensource.apple.com/source/xnu/xnu-201/osfmk/kern/printf.c.auto.html但是请记住,正如其他人提到的那样,它依赖于机器,但仍然是一个很好的例子。
6条答案
按热度按时间i1icjdpr1#
标准库函数的确切源代码在不同的实现中会有所不同-也就是说,
*printf
家族的源代码对于gcc、LLVM、Visual Studio编译器等会有所不同。话虽如此,GNU C库(glibc)的源代码可以在here中找到。同样,这只是许多不同实现中的一个。
dgjrabp22#
这大概是它包含的内容:
一个例子取自《C语言》一书。这本书是由Brian Kernighan和Dennis里奇写的。你会在那里找到C语言和其他标准函数的详细解释。
zfciruhq3#
您可以简单地右键单击printf并查看描述它的完整代码。
以下是在Visual Studio中如何执行此操作:
9rygscc14#
它被称为逆向工程,你可以使用像
IDA
和Ghidra
这样的工具。你可以做的另一件事是在互联网上寻找该函数实现的开源版本,比如从
Linux
,例如here。q43xntqr5#
大多数时候,你看到你必须在你的c程序中包含一些头文件,以便使用一些函数,例如,任何时候你想使用printf函数,你需要使用stdio. h。所以在stdio. h中,你可以看到一个已经定义的函数,称为printf。注意,在一些头文件中可能包含其他文件,所以如果你不能看到一个函数的完整定义,看看其他的头文件中已经定义的,但是你曾经在你的c程序中使用过的每个函数都已经在linux中的这些目录中的一个头文件中定义了:
/usr/包含
/usr/包含/Linux
aij0ehis6#
如果你对一个好的示例源代码感兴趣,请参考链接
https://opensource.apple.com/source/xnu/xnu-201/osfmk/kern/printf.c.auto.html
但是请记住,正如其他人提到的那样,它依赖于机器,但仍然是一个很好的例子。