6.13.1 Прототипы и определения функций в старом стиле
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-15.3.0/gcc/Function-Prototypes.html