#c #function #parameters #variadic-functions #variadic
#c #функция #параметры #переменные-функции #переменный
Вопрос:
Может va_list
ли s обрабатывать ссылки на C ? Я знаю, что они могут обрабатывать целые числа, удвоения и указатели, но не числа с плавающей запятой, символы и т.д. Могут ли они обрабатывать ссылки на C ?
Комментарии:
1. не плавающие, символы и т. Д.? Можете ли вы предоставить ссылку для этого? Я не знаю
va_list
, и я очень удивлен тем, что вы говорите. Я быстро проверил, но ничего подобного не нашел2. Я предполагаю, что они означают тот факт, что когда выражение типа
float
задается в качестве аргумента переменной функции, оно преобразуется вdouble
, и поэтому вызываемая функция должна извлекать его сva_arg(ap, double)
помощью .va_arg(ap, float)
обычно это не работает. Аналогичноchar
преобразуется вint
илиunsigned int
.3. видео о переменных функциях в C. Ваш вопрос касается C . Также заголовок C
cstadarg
неstdarg.h
является. Не путайте C и C как одинаковые только потому, что C пытается быть похожим4. Видео @Serket Youtube никогда не являются ответом на что-либо программирующее. Пожалуйста, предоставьте ссылку на документацию или цитату из стандарта, в которой это указано.
5. Когда вы используете C , вам следует взглянуть на переменные шаблоны / пакеты параметров . Это может быть лучшей альтернативой.
Ответ №1:
Вы должны #include <cstdarg>
, а не <stdarg.h>
…
Если вызывающий объект предоставляет ссылку в качестве аргумента для такой функции, вызов будет работать так же, как если бы ссылочный объект был указан напрямую. Например, если у вас есть:
void f(...);
T my_t;
Tamp; x = my_t;
f(my_t);
f(x);
Значения, передаваемые в регистрах и / или в стеке в качестве аргументов для f
, будут одинаковыми в обоих вызовах (предполагая вызовы вне строки и функционально эквивалентные, если встроенные).
Итак, «могут ли они обрабатывать ссылки на C » — да, описанным выше способом, который может быть или не быть тем, что вы хотели / ожидали.
Просто предостережение: если у вас есть…
f(Aamp; b, ...);
… поведение не определено, поскольку va_start
макрос не поддерживает использование последнего ...
аргумента предварительного сопоставления в качестве ссылки (вы также не можете передать лямбда-захват или расширение пакета). Для получения полной информации см. Стандарт C [cstdarg.syn] параграф 1.