Заголовочный файл <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> для принятия переменного количества аргументов?
Если да, то как это делается?