stdio.h содержит определение или объявление функций? - PullRequest
0 голосов
/ 16 апреля 2020

Я прочитал, что заголовочный файл 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;
}

Ответы [ 3 ]

1 голос
/ 20 апреля 2020

Код, который вы процитировали, кажется, является определениями функций.

Заголовочные файлы , которые вы создаете , должны содержать только

  • определения макросов
  • определения структур, объединений и имен типов-определений
  • объявлений переменных
  • объявлений функций в виде прототипов

Позже (как только ваши навыки C несколько повысились) вы также можете включить

  • определения из inline functions

Реализатор компилятора, с другой стороны, может помещать все что угодно в свои заголовочные файлы, если их компилятор ведет себя так, как говорит языковой стандарт. Вам следует полагаться только на документацию компилятора, а не на то, что вы можете интуитивно понять, читая другие файлы, поставляемые с компилятором, чтобы понять его поведение.

Разработчику компилятора разрешено использовать любые волхвы c, которые они выбирают в том числе наличие компилятора Just Know того, какие системные заголовки требуются в стандарте для определения и объявления без каких-либо фактических файлов для этих заголовков, и, если они того пожелают, они могут даже предоставить файлы "заголовков", содержащие поддельные или вводящее в заблуждение содержание.

0 голосов
/ 20 апреля 2020

Вероятно, вам следует добавить полное определение функции, как предполагается, из 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 функция.

0 голосов
/ 20 апреля 2020

Согласно C -языковому стандартному проекту

7.21 Вход / выход

7.21.1

Введение

1 Заголовок определяет несколько макросов и объявляет три типа и множество функций для выполнения ввода и вывода.

2 Объявлены следующие типы: size_t (описано в 7.19);

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

Что делает код: он печатает отформатированные данные в поток.

...