Spec-Zone.ru › GCC 4

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

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

Spec-Zone.ru

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