stdio.h 包含函数的定义或声明?

stdio.h contains definition or declaration of functions?

我读到 stdio.h 头文件包含函数声明(带有原型)、宏定义和数据类型定义。但是当我在 VSCode 中打开文件时,它也包含函数定义——不确定它们是定义还是其他东西。请解释以下内容。这段代码在做什么?更重要的是,它是函数定义吗?

mingw_stdio_redirect

int fprintf (FILE *__stream, const char *__format, ...)
{ 
    register int __retval;

    __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );

    __retval = __mingw_vfprintf( __stream, __format, __local_argv );

    __builtin_va_end( __local_argv );

    return __retval; 
}

mingw_stdio_redirect

int printf (const char *__format, ...)
{
    register int __retval;

    __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );

    __retval = __mingw_vprintf( __format, __local_argv );

    __builtin_va_end( __local_argv );

    return __retval;
}

根据C语言标准草案

7.21 Input/output

7.21.1

Introduction

1 The header defines several macros, and declares three types and many functions for performing input and output.

2 The types declared are size_t (described in 7.19);

Link -> http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf(第 314 页)

至于代码的作用:它将格式化数据打印到流中。

您引用的代码似乎是函数的定义。

您创建的

Header 个文件 应仅包含

  • 宏的定义
  • 结构、联合和 typedef-names
  • 的定义
  • 声明变量
  • 函数的声明,以原型的形式

稍后(一旦您的 C 技能有所提高)您还可以包括

  • inline 个函数

另一方面,编译器实现者可以将他们喜欢的任何内容放入 header 文件中,只要他们的编译器按照语言标准规定的方式运行即可。您应该仅依赖编译器的文档,而不是您从阅读编译器提供的其他文件中可能凭直觉理解的任何内容,以了解其行为。

编译器实现者可以使用他们选择的任何魔法,包括让编译器只知道标准需要什么系统header来定义和在没有任何实际文件的情况下为这些 header 声明,如果他们选择这样做,他们甚至可能提供 "header" 包含虚假或误导性内容的文件。

可能您应该添加应该来自 MinGW 的完整函数定义,它看起来是:

__mingw_ovr
__attribute__((__format__ (gnu_printf, 1, 2))) __MINGW_ATTRIB_NONNULL(1)
int printf (const char *__format, ...)
{
  register int __retval;
  __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );
  __retval = __mingw_vprintf( __format, __local_argv );
  __builtin_va_end( __local_argv );
  return __retval;
}

发现与此处发现的原始 GNU stdio.h 完全不同: https://code.woboq.org/userspace/glibc/libio/stdio.h.html

无论哪种方式,mingw 看起来都在头文件中有函数定义。如果你看 #define __mingw_ovr static __attribute__ ((__unused__)) __inline__ __cdecl __mingw_ovr 是什么 - 它似乎是一个 inline 函数。