Есть ли способ чтения/доступа к аргументам переменных, как мы читаем аргументы командной строки из argv[]?
Я знаю о способе va_arg сделать это, но просто интересно, существует ли для этого что-то вроде «argv»?
@ Brian61354270 Я имел в виду, например, как аргументы командной строки для программы хранятся в argv. (int main(int argc, char **argv)). Есть ли аналогичный способ чтения переменных аргументов функции?
Единственное средство, которое стандарт C предоставляет для доступа к переменным аргументам, — это метод va_arg.
@ akc5 вы можете передать массив + длину, что и делает ваша среда выполнения C для вызова main. Вы не получите точно синтаксис вызова «переменное количество аргументов», но вы всегда можете это сделать T args[] = {arg1, arg2, arg3}; foo(args, sizeof(args)/sizeof(T));
Вы можете передать массив с дозорным завершением: ideone.com/YWrkfI





Единственное средство, которое стандарт C предоставляет для доступа к переменным аргументам, — это метод va_arg.
В общем, было бы невозможно (за исключением некоторых грубых расширений языка) для любого вида va_arg[i] метода доступа к переменным аргументам, поскольку va_arg[i] должен иметь один фиксированный тип, но переменные аргументы могут иметь любой полный объектный тип.
Реализация C может реализовать функции <stdarg.h> путем последовательной организации аргументов в памяти, а затем можно будет получить доступ к этой памяти самостоятельно, включая доступ к ней как к массиву всех переменных аргументов одного типа. Однако средства для этого не только не будут переносимы на другие реализации C, но и вообще не будут поддерживаться конкретной реализацией C.
Возможно, вы имеете в виду то, что такие функции, как printf, могут принимать разные аргументы в разное время?
printf является примером функции с переменным числом переменных и объявляется как:
printf(char* format, ...);
Где ... означает, что следующие аргументы могут быть любого типа, и их может быть любое количество.
Они обрабатываются вызывающей стороной с использованием типа va_list и макросов va_start, va_arg и va_end, определенных в заголовочном файле <stdarg.h>.
В Интернете есть множество примеров, которые объясняют, как это используется.
Не могли бы вы уточнить, что вы подразумеваете под «что-то вроде« argv »»? Вы имеете в виду что-то вроде функции
void foo(int argc, T* argv), где вы можете получитьargcэлементы типаTизargv? Если это так, вы можете просто передать массив с этой семантикой.