【问题标题】:How to find the source code for printf in C?如何在 C 中找到 printf 的源代码?
【发布时间】:2020-01-19 14:50:50
【问题描述】:

我很想知道printf 函数里面有什么。

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

【问题讨论】:

  • 所以你想查看源代码,而不是执行它...
  • 许多标准库都有可用的源代码。如果您告诉我们您正在使用什么编译器以及用于什么平台,那么我们可以告诉您在哪里可以找到源代码。但请注意,大多数实现对于初学者来说都很难阅读和理解。

标签: c printf


【解决方案1】:

标准库函数的确切源代码会因实现而异 - 也就是说,*printf 系列的源代码对于 gcc、LLVM、Visual Studio 编译器等会有所不同。并非每个实现都提供其源代码.

话虽如此,GNU C 库 (glibc) 的源代码可以在 here 找到。同样,这只是众多不同实现中的一种。

【讨论】:

    【解决方案2】:

    这大概是它包含的内容:

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

    【讨论】:

      【解决方案3】:

      您只需右键单击 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 中的操作方式:

      【讨论】:

        【解决方案4】:

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

        您可以做的另一件事是在 Internet 上查找该函数实现的开源版本,例如来自 Linux,例如 here

        【讨论】:

          【解决方案5】:

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

          /usr/包含

          /usr/include/linux

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-01-16
            • 1970-01-01
            • 2023-03-18
            • 2016-12-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多