#c #variadic-functions #ellipsis
Вопрос:
Для этой функции, которая принимает переменное количество аргументов,
void func(int count, ...) // ellipsis function
{
// function definition
}
Может ли вызов функции выполняться следующим образом :
int a{};
double b{};
string c{};
func(3,a,b,c); // using actual variables instead of fixed values in function call
Мой вопрос в том, что когда вызывается функция с многоточием, всегда ли это должны быть только fixed
такие значения, как func(3,5,2.7,"Hi")
или переменные могут быть предоставлены при вызове функции таким образом func(3,a,b,c)
?
Комментарии:
1. Эллипс — это вытянутый круг. Я думаю, что вам нужен термин многоточие.
2. И C прекрасно подходит для использования переменных для функций с многоточием. Но функция должна иметь способ определения типа параметров.
3. Для дальнейшего исследования попробуйте «аргументы переменной функции»
4. Помогло бы, если бы вы использовали другую функцию для своего примера? Вместо
func()
, может быть, спросить оprintf()
? Это принимает переменное количество аргументов, и это даже пример такой функции, заданный cppreference.com .5. @PratapBiswakarma printf использует va_args более старый механизм C. В C у вас есть возможность использовать переменные шаблоны, которые позволяют вам также получать доступ к информации о типе введенных вами аргументов (вместо того, чтобы предполагать или указывать в строке, например printf).
Ответ №1:
Обратите внимание, что передача таких классов, как std::string
, с помощью нетривиального конструктора копирования или нетривиального конструктора перемещения или нетривиального деструктора, может не поддерживаться и имеет «определяемую реализацией» семантику. Вы должны проверить документацию вашего компилятора о том, как передаются такие классы, или проверить, поддерживаются ли они вообще.
Могут ли переменные использоваться при вызове функции в функциях с многоточием в C
ДА.
Может ли вызов функции выполняться следующим образом
ДА.
при вызове функции с многоточием всегда должны быть только фиксированные значения, такие как func(3,5,2.7, «Hi»)
Нет.
могут ли переменные быть предоставлены при вызове функции, как so func(3,a,b, c)?
ДА.
Можете ли вы предложить какую-либо ссылку, чтобы я мог провести некоторые исследования по этому вопросу?
https://en.cppreference.com/w/cpp/language/variadic_arguments https://en.cppreference.com/w/cpp/utility/variadic https://eel.is/c черновик/выражение#вызов-12
И в C вы должны настоятельно предпочесть: https://en.cppreference.com/w/cpp/language/parameter_pack , из-за безопасности типа.
Ответ №2:
Хотя многоточие дает нам некоторую полезную функциональность, использовать их довольно опасно. При использовании многоточия компилятор не проверяет тип аргументов, передаваемых функции. Таким образом, компилятор не выдает никаких ошибок, если аргументы имеют разные типы. Даже если передать значения типа string, double или bool в функцию average(), которую она возвращает, возвращает неожиданное значение, компилятор не выдает никакой ошибки.
Источник : https://www.geeksforgeeks.org/ellipsis-in-c-with-examples /
Комментарии:
1. Это не помогает!