【发布时间】:2020-01-19 14:50:50
【问题描述】:
我很想知道printf 函数里面有什么。
终端或cmd中是否有任何命令可以获取该函数的源代码?
【问题讨论】:
-
所以你想查看源代码,而不是执行它...
-
许多标准库都有可用的源代码。如果您告诉我们您正在使用什么编译器以及用于什么平台,那么我们可以告诉您在哪里可以找到源代码。但请注意,大多数实现对于初学者来说都很难阅读和理解。
我很想知道printf 函数里面有什么。
终端或cmd中是否有任何命令可以获取该函数的源代码?
【问题讨论】:
标准库函数的确切源代码会因实现而异 - 也就是说,*printf 系列的源代码对于 gcc、LLVM、Visual Studio 编译器等会有所不同。并非每个实现都提供其源代码.
话虽如此,GNU C 库 (glibc) 的源代码可以在 here 找到。同样,这只是众多不同实现中的一种。
【讨论】:
这大概是它包含的内容:
#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 并查看描述它的完整代码。
_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
【讨论】:
它称为逆向工程,您可以使用IDA 和Ghidra 之类的工具。
您可以做的另一件事是在 Internet 上查找该函数实现的开源版本,例如来自 Linux,例如 here。
【讨论】:
大多数时候你看到你必须在你的c程序中包含一些头文件才能使用一些功能,例如任何时候你想使用printf函数你需要使用stdio.h。所以在 stdio.h 你可以看到一个已定义的函数称为 打印。请注意,在某些头文件中可能包含其他文件,因此如果您看不到函数的完整定义,请查看已定义的其他头文件,但您曾经在 c 程序中使用过的每个函数已在 linux 中这些目录之一的标题之一中定义:
/usr/包含
/usr/include/linux
【讨论】: