2013-03-27 3 views
1

Я ответил на этот вопрос How can I get my va_list arguments to repeat itself? и заметил необычное объявление функции:Что это означает `void func (bool b ...)`?

void ordered(int num1, double list ...); 

Сначала я думал, что компилятор будет жаловаться, но лязг 3,2 не и ни сделал г ++ 4.7.2.

В чем заключается эта декларация? Как он интерпретируется?

Редактировать: Я знаю об эллипсисе. Но нормальная форма - <return type> <function-name>(<argument1-type> <arg-name>, ...); в примере отсутствует запятая.

+0

Этот вид напоминает мне о http://stackoverflow.com/questions/5625600/what-is-the-meaning-of-token – chris

ответ

3

Это то же самое, как:

void ordered(int num1, double list, ...); 
+0

И я думаю, что эта декларация не работает с 'va_arg' ? Мои тесты, по крайней мере, показывают, что они этого не делают. – RedX

+0

@RedX, он должен работать так же, как и любая другая вариационная функция C. – chris

+0

Да, это так, мой тестовый случай был неправильным :) – RedX

1

три точки (...) называется «эллипсы» и обозначают список переменных аргументов. Таким образом, вы можете передать столько аргументов, сколько захотите (есть ограничение по ОС). Таким образом, работает printf.

См. here для более подробного объяснения.

1

Я думаю, вы имеете в виду «...» право?

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

3

Это фрагмент грамматики в стандарте C++:

parameter-declaration-clause: 
    parameter-declaration-list[opt] ...[opt] 
    parameter-declaration-list , ... 

В основном многоточие может предшествовать ,, если другие декларации параметров, но это не должно быть. Объявление функции:

void f(int,double...); 

на самом деле означает:

void f(int,double,...); 
+0

Интересно, не знал, что запятая в этом случае была необязательной. Спасибо. – RedX

+0

+1 Убей меня :) –

2
void ordered(int num1, double list ...); 

такой же, как:

void ordered(int num1, double list, ...); 

Ссылка:
Standard C++ 11 8.3.5.3/4 :

parameter-declaration-clause: 
parameter-declaration-listopt ...opt 
parameter-declaration-list , ... 

Если parameter-declaration-clause заканчивается многоточием или параметр функции пакета (14.5.3), количество аргументов должно быть равно или больше, чем число параметров, которые не имеют аргумент по умолчанию и являются не функциональные пакеты параметров. Где синтаксически правильно и где “...” не является частью abstract-declarator, “, ...” является синонимом “...”.

Смежные вопросы