Spec-Zone.ru › GCC 6

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

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-6.5.0/gcc/Function-Prototypes.html

Spec-Zone.ru

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