繁体   English   中英

如何在C中找到printf的源代码?

[英]How to find the source code for printf in C?

我很想知道printf函数内部是什么。

终端或cmd中是否有任何命令可以获取该功能的源代码?

它称为逆向工程,您可以使用IDAGhidra类的工具。

您可以做的另一件事是在 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

以下是您在 Visual Studio 中的操作方法: 打印输出

大多数时候你会看到你必须在你的 c 程序中包含一些头文件才能使用某些功能,例如任何时候你想使用 printf 函数你需要使用 stdio.h。 所以在 stdio.h 中你可以看到一个被定义为 printf 的函数。 请注意,在某些头文件中可能包含其他文件,因此如果您看不到函数的完整定义,请查看已在那里定义的其他头文件,但您在 c 程序中使用过的每个函数已在 linux 中这些目录之一的标头之一中定义:

/usr/包括

/usr/include/linux

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM