Определение типа аргумента функции после ")", это очень старый стандарт?

Я читаю старую книгу об обфускации кода в C (книга была напечатана в 1993 году), и я заметил, что функции с аргументами реализованы следующим образом:

real_dump(address, infunc, ofp)
char *address;
int (*infunc)();
FILE *ofp;
{
    /* the code goes here... */
}

Кроме того, тип возвращаемого значения не задан.

Это старый стандарт? Можно ли включить gcc для компиляции этого кода?

Ответы

Ответ 1

Определения функций в непротопической форме являются допустимыми C89, C99 и C11.

Он называется определением функции старого стиля, но эта функция отмечена как C89 как устаревшая функция.

Эта форма должна быть не, используемой в новых программах.

C99 Обоснование гласит:

"Характеристика старого стиля как устаревшего означает обескураживать его использования и в качестве сильного одобрения со стороны Комитета новый стиль".

даже K & R2 препятствует его использованию:

"Старый стиль декларации и определения по-прежнему работает с ANSI C, по крайней мере, в течение переходного периода, но мы настоятельно рекомендуем вам использовать новую форму, когда у вас есть компилятор, который ее поддерживает".

Теперь ваша функция также не имеет типа возврата и опускает тип возвращаемого значения в объявлении функции или в определении функции больше не действует с C99. До C99 функции без возвращаемого типа неявно возвращают int.

Что касается вопроса gcc, по умолчанию gcc компилируется с -std=gnu89. Это означает расширение C89 Standard + gcc. Поэтому по умолчанию gcc будет принимать компиляцию программы с объявлением функций и определением в их старомодной форме и без возвращаемого типа.

Ответ 2

Ой, это был способ ANS-C до определения ANSI, я действительно не рекомендую использовать этот вид синтаксиса в "нормальном" коде. Тем не менее, gcc, похоже, принимает его без проблем (он все еще находится в стандарте, хотя и помечен как "устаревший" в §6.11.7).

(кстати, как и для типа "отсутствия" возврата, должно применяться "неявное правило int" )

Ответ 3

Это стиль объявления функции Kernighan и Ritchie. K & R C предшествовал ANSI C, в котором добавлены прототипы функций стиля С++, которые наиболее часто используются сейчас.

Ответ 4

Отсутствие типа возврата означает, что тип возврата int. Это значение по умолчанию.