[英]How to find the source code for printf in C?
我很想知道printf
函数内部是什么。
终端或cmd中是否有任何命令可以获取该功能的源代码?
它称为逆向工程,您可以使用IDA
和Ghidra
类的工具。
您可以做的另一件事是在 Internet 上查找该函数实现的开源版本,例如来自Linux
,例如这里。
大致内容是这样的:
#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 Ritchie) 撰写的书。 您将在那里找到 C 语言和其他标准函数的详细说明。
标准库函数的确切源代码因实现而异——也就是说, *printf
系列的源对于 gcc、LLVM、Visual Studio 编译器等会有所不同。并非每个实现都提供它们的源代码。
话虽如此,可以在此处找到 GNU C 库 (glibc) 的源代码。 同样,这只是许多不同实现中的一种。
您只需右键单击 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
大多数时候你会看到你必须在你的 c 程序中包含一些头文件才能使用某些功能,例如任何时候你想使用 printf 函数你需要使用 stdio.h。 所以在 stdio.h 中你可以看到一个被定义为 printf 的函数。 请注意,在某些头文件中可能包含其他文件,因此如果您看不到函数的完整定义,请查看已在那里定义的其他头文件,但您在 c 程序中使用过的每个函数已在 linux 中这些目录之一的标头之一中定义:
/usr/包括
/usr/include/linux
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.