Объявления переменных C после заголовка функции в определении [дубликаты]

При чтении исходного кода FreeBSD (см.: radix.h строки 158-173), я обнаружил объявления переменных, которые следовали за "заголовком функции" в определении.

Это действительно в ISO C (C99)? когда это должно быть сделано в производственном коде вместо того, чтобы просто объявлять переменные в «заголовке функции»? Почему это делается здесь?

Я имею в виду функцию, возглавляющую строку, которая выглядит так: int someFunction(int i, int b) {


person Yktula    schedule 13.04.2010    source источник
comment
Джеймс, ты прав. Я не сталкивался с этим вопросом, когда искал ответ. Прости!   -  person Yktula    schedule 18.04.2010


Ответы (3)


Это похоже на стиль K&R (до ANSI). Я не думаю, что это действительный C99, но они используют C99? Джоэл

person Joel J. Adamson    schedule 13.04.2010
comment
C99 поддерживает определения функций в стиле K&R (они устарели, но, тем не менее, поддерживаются). - person James McNellis; 14.04.2010
comment
Объявления в стиле K&R действительны в C99, за исключением того, что в C99 все параметры должны быть явно объявлены, тогда как в K&R (и C89/90) int параметры могут быть оставлены необъявленными. - person AnT; 14.04.2010
comment
@James McNellis: интересно - я думал, что поддержка определения функций в стиле K&R также была удалена из C99. Я не уверен, почему... - person Michael Burr; 14.04.2010
comment
C in a Nutshell говорит: эта нотация... устарела, хотя компиляторы все еще ее поддерживают. В новом исходном коде C используйте только нотацию прототипа для определений функций... (стр. 98, первое издание, 2005 г.) Если это стиль Беркли, то они, вероятно, не собираются менять свой компилятор, чтобы противоречить их стилю. - person Joel J. Adamson; 14.04.2010

Я думаю, вы имеете в виду «старомодный» способ объявления параметров до ANSI в C. Это выглядело примерно так:

int foo(a, b)
    int a,
    int b
{
    /* ... */
}

Это может все еще быть действительным в C99 и будет принято компиляторами по причинам обратной совместимости, но его следует считать устаревшим/архаичным.

person Kristopher Johnson    schedule 13.04.2010

Эр. Возможно, я неправильно понял ваш вопрос, но i и b в этом фрагменте являются параметрами функции. Это не какой-то компактный способ объявления переменных внутри функции, например:

int someFunction() {
    int i, b;

Когда вы вызываете someFunction, вы передаете ему эти аргументы:

someFunction(1, 2); // `i` will be `1` and `b` `2` within `someFunction`
person Michael Mrozek    schedule 13.04.2010