Заголовочный файл <stdarg.h>
используется, чтобы заставить функции принимать undefined количество аргументов, правильно?
Итак, printf()
funtion <stdio.h>
должен использовать <stdarg.h>
для принятия переменного количества аргументов (пожалуйста, исправьте меня, если я ошибаюсь).
Я нашел следующие строки в файле stdio.h файла gcc:
#if defined __USE_XOPEN || defined __USE_XOPEN2K8
# ifdef __GNUC__
# ifndef _VA_LIST_DEFINED
typedef _G_va_list va_list;
# define _VA_LIST_DEFINED
# endif
# else
# include <stdarg.h>//////////////////////stdarg.h IS INCLUDED!///////////
# endif
#endif
Я не могу понять большую часть того, что в нем, но он включает в себя <stdarg.h>
Итак, если printf()
использует <stdarg.h>
для принятия переменного количества аргументов, а stdio.h
имеет printf()
, программа C, использующая printf()
, не должна включать <stdarg.h>
, это?
Я попробовал программу с printf()
и определяемую пользователем функцию, принимающую переменное число аргументов.
Программа, которую я пробовал, это:
#include<stdio.h>
//#include<stdarg.h>///If this is included, the program works fine.
void fn(int num, ...)
{
va_list vlist;
va_start(vlist, num);//initialising va_start (predefined)
int i;
for(i=0; i<num; ++i)
{
printf("%d\n", va_arg(vlist, int));
}
va_end(vlist);//clean up memory
}
int main()
{
fn(3, 18, 11, 12);
printf("\n");
fn(6, 18, 11, 32, 46, 01, 12);
return 0;
}
Он отлично работает, если включен <stdarg.h>
, но в противном случае генерируется следующая ошибка:
40484293.c:13:38: error: expected expression before ‘int’ printf("%d\n", va_arg(vlist, int));//////error: expected expression before 'int'///////// ^~~
Как это?
Или это то, что printf()
не использует <stdarg.h>
для принятия переменного количества аргументов?
Если да, то как это делается?