Spec-Zone.ru › GCC 14

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++ не поддерживает определения функций старого стиля, поэтому это расширение не имеет значения.

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

Spec-Zone.ru

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