Подтвердить что ты не робот

Что это за синтаксис определения странных функций в C?

Я видел несколько определений функций, подобных этому в последнее время, играя с GNU Bison:

static VALUE
ripper_pos(self)
    VALUE self;
{
    //code here
}

Почему тип self вне скобки? Действительно ли это C?

4b9b3361

Ответ 1

Это старые объявления параметров функции стиля K & R, объявляющие типы параметров отдельно:

int func(a, b, c)
   int a;
   int b;
   int c;
{
  return a + b + c;
}

Это то же самое, что и более современный способ объявления параметров функции:

int func(int a, int b, int c)
{
  return a + b + c;
}

Объявления "нового стиля" в основном универсальны.

Ответ 2

Это так называемый "старый" вариант объявления аргументов функции. В древние времена вы не могли просто писать типы аргументов внутри круглых скобок, но вам приходилось определять их для каждого аргумента сразу после закрывающей скобки.

Другими словами, это эквивалентно ripper_pos( VALUE self )

Ответ 3

Да, он использует более старый стиль определения функции, в котором параметры, sans type, перечислены в скобках, а затем объявление этих переменных с их типами перед открывающей скобкой тела функции. Итак, self имеет тип VALUE.

Ответ 4

Это старый c. K & R C использовал это соглашение до того, как ANSI C принудительно вводил типизированные параметры.

static VALUE  // A static function that returns 'VALUE' type.
ripper_pos(self)  // Function 'ripper_pos' takes a parameter named 'self'.
    VALUE self;   // The 'self' parameter is of type 'VALUE'.

Ответ 6

Это действительно старый код C, где вы сначала указываете имена аргументов, а затем их типы. См. Например здесь.