Spec-Zone.ru › GCC 11

Следующее: Комментарии в стиле C++, Предыдущее: Синтаксис атрибутов, Вверх: Расширения семейства языков C [Оглавление][Индекс]

6.40 Прототипы и старые определения функций ¶

GNU C расширяет ISO C, позволяя прототипу функции переопределять последующее старое определение без прототипа. Рассмотрим следующий пример:

/* Use prototypes unless the compiler is old-fashioned.  */
#ifdef __STDC__
#define P(x) x
#else
#define P(x) ()
#endif

/* Prototype function declaration.  */
int isroot P((uid_t));

/* Old-style function definition.  */
int
isroot (x)   /* ??? lossage here ??? */
     uid_t x;
{
  return x == 0;
}

Предположим, что тип uid_t оказывается short. ISO C не допускает этот пример, потому что подсловные аргументы в старых определениях без прототипов повышаются. Следовательно, в этом примере аргумент определения функции фактически является int, что не соответствует типу аргумента прототипа short.

Это ограничение ISO C затрудняет написание кода, совместимого с традиционными компиляторами C, так как программисту неизвестно, является ли тип uid_t типом short, int или long. Поэтому в таких случаях GNU C позволяет прототипу переопределять последующее старое определение. Более точно, в GNU C тип аргумента функции-прототипа переопределяет тип аргумента, указанный в последующем старом определении, если первый тип совпадает со вторым типом до повышения. Таким образом, в GNU C приведенный выше пример эквивалентен следующему:

int isroot (uid_t);

int
isroot (uid_t x)
{
  return x == 0;
}

GNU C++ не поддерживает старые определения функций, поэтому это расширение не имеет значения.

Следующее: Комментарии в стиле C++, Предыдущее: Синтаксис атрибутов, Вверх: Расширения семейства языков C [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/Function-Prototypes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API