Могут ли va_lists в stdarg.h обрабатывать ссылки на C ?

#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.