"> VARARGS(3)

VARARGS(3)
XENIX System V (21 èþíÿ 1987)

ÈÌß
varargs - yïpaâëÿeò cïècêoì ïepeìeííoé äëèíû

ÑÈÍÒÀÊÑÈÑ

	#include <varargs.h>
	
	function(va_alist)
	va_dcl
	va_list pvar;
	va_start(pvar);
	f=va_arg(pvar,type);
	va_end(pvar);

ÎÏÈÑÀÍÈÅ
Ýòè ìaêpocû ïoçâoëÿþò ïècaòü ìoáèëüíûe ïpoãpaììû, paáoòaþùèe co cïècêaìè apãyìeíòoâ ïepeìeííoé äëèíû. Ôyíêöèè, êoòopûì ìoãyò ïepeäaâaòücÿ cïècêè apãyìeíòoâ paçëè÷íoé äëèíû (íaïpèìep printf(3)) è êoòopûe íe ècïoëüçyþò varargs, còaíoâÿòcÿ íeïepeíocèìûìè, ïocêoëüêy cïocoá ïepeäa÷è apãyìeíòoâ ìaøèíío-çaâècèì.

Va_alist ècïoëüçyeòcÿ â êa÷ecòâe ïapaìeòpa ôyíêöèè c ïepeìeííûì ÷ècëoì apãyìeíòoâ è oáoçía÷aeò cïècoê apãyìeíòoâ.

Va_dcl ÿâëÿeòcÿ oïècaòeëeì äëÿ va_alist. Ïocëe íeão íe íyæío còaâèòü òo÷êy c çaïÿòoé.

Va_list ýòo òèï ïepeìeííûx, ècïoëüçyeìûx äëÿ ïepeìeííoé pvar, êoòopaÿ ècïoëüçyeòcÿ äëÿ paáoòû co cïècêoì. Äoëæía áûòü oïècaía ïo ìeíüøeé ìepe oäía òaêaÿ ïepeìeííaÿ.

Va_start(pvar) âûçûâaeòcÿ äëÿ èíèöèaëèçaöèè pvar ía ía÷aëo cïècêa.

Va_arg (pvar,type) âoçâpaùaeò cëeäyþùèé apãyìeíò èç cïècêa, ía êoòopûé yêaçûâaeò pvar. Type ÿâëÿeòcÿ òèïoì oæèäaeìoão apãyìeíòa. B cïècêe ìoãyò áûòü cìeøaíû apãyìeíòû paçíûx òèïoâ, ío ôyíêöèÿ äoëæía çíaòü òèï o÷epeäíoão apãyìeíòa, òaê êaê ýòo íeëüçÿ oïpeäeëèòü âo âpeìÿ âûïoëíeíèÿ ïpoãpaììû.

Va_end(pvar) âûçûâaeòcÿ äëÿ çaâepøeíèÿ paáoòû co cïècêoì.

B ïpoãpaììe ìoæeò áûòü íecêoëüêo y÷acòêoâ paáoòû c ïepeìeííûì cïècêoì apãyìeíòoâ, çaêëþ÷eííûx â ïapû va_start ... va_end.

ÏPÈÌEP

	#include <stdio.h>
	#include <varargs.h>
	
	main()
	{
	   show(2,3.1,"buf",4.1,"end");
	   show(1,5.9,"hello");
	   show(4,6.2,"oops",5.3,"blah",5.1,"lovely",
	     2.3,"madrigal");
	}
	
	/* Ïepâûé apãyìeíò èìeeò òèï "öeëoe" è yêaçûâaeò
	* ía êoëè÷ecòâo ïap apãyìeíòoâ, êoòopûe ïocëeäyþò
	*  ça íèì. Ýòèìè ïapaìè ÿâëÿþòcÿ ïepeìeííûe
	* c ïëaâaþùeé òo÷êoé è yêaçaòeëè ía còpoêè.
	*
	* Çaïoìíèòe, ÷òo ïpè ïepeäa÷e ïepeìeííûx c
	* ïëaâaþùeé òo÷êoé oíè ïpeoápaçyþòcÿ â òèï
	* double, a ïepeìeííûe òèïa char - â òèï int.
	*/
	show(n,va_alist)
	int n;
	va_dcl
	{
	     va_list ap;
	     int i;
	     double f;
	     char *p;
	
	     va_start(ap);
	     for(i=0; i<n; i++) {
	          f = va_arg(ap,double);
	          p = va_arg(ap,char *);
	          printf("%4.1f %s\n",f,p);
	     }
	     va_end(ap);
	}

ÇAÌE×AÍÈß
Bûçûâaþùaÿ ôyíêöèÿ caìa äoëæía oïpeäeëÿòü êoëè÷ecòâo apãyìeíòoâ, òaê êaê âûçûâaeìaÿ ôyíêöèÿ íe ìoæeò oïpeäeëèòü ÷ècëo ïepeäaííûx eé apãyìeíòoâ ïo còeêy. Haïpèìep, ôyíêöèè excel ïepeäaeòcÿ íyëeâoé yêaçaòeëü â êa÷ecòâe ïpèçíaêa êoíöa cïècêa apãyìeíòoâ. Printf oïpeäeëÿeò ÷ècëo apãyìeíòoâ, aíaëèçèpyÿ ôopìaòíyþ còpoêy.