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