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

qvtsj1bj  于 2023-04-05  发布在  其他
关注(0)|答案(6)|浏览(285)

我很想知道printf函数里面有什么。
在terminal或cmd中是否有命令可以获取该函数的源代码?

i1icjdpr

i1icjdpr1#

标准库函数的确切源代码在不同的实现中会有所不同-也就是说,*printf家族的源代码对于gcc、LLVM、Visual Studio编译器等会有所不同。
话虽如此,GNU C库(glibc)的源代码可以在here中找到。同样,这只是许多不同实现中的一个。

dgjrabp2

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语言和其他标准函数的详细解释。

zfciruhq

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中如何执行此操作:

9rygscc1

9rygscc14#

它被称为逆向工程,你可以使用像IDAGhidra这样的工具。
你可以做的另一件事是在互联网上寻找该函数实现的开源版本,比如从Linux,例如here

q43xntqr

q43xntqr5#

大多数时候,你看到你必须在你的c程序中包含一些头文件,以便使用一些函数,例如,任何时候你想使用printf函数,你需要使用stdio. h。所以在stdio. h中,你可以看到一个已经定义的函数,称为printf。注意,在一些头文件中可能包含其他文件,所以如果你不能看到一个函数的完整定义,看看其他的头文件中已经定义的,但是你曾经在你的c程序中使用过的每个函数都已经在linux中的这些目录中的一个头文件中定义了:
/usr/包含
/usr/包含/Linux

aij0ehis

aij0ehis6#

如果你对一个好的示例源代码感兴趣,请参考链接
https://opensource.apple.com/source/xnu/xnu-201/osfmk/kern/printf.c.auto.html
但是请记住,正如其他人提到的那样,它依赖于机器,但仍然是一个很好的例子。

相关问题