va_arg

Jan Waclawek konfera na efton.sk
Pátek Červenec 22 21:59:43 CEST 2016


Na tento pripad sa vztahuje posledna veta C99, 6.5.2.2#7, ktora vravi, ze
parametre odovzdane do elipsy podliehaju "default argument promotions",
tieto promotions boli definovane predtym v C99, 6.5.2.2#6. To je to iste
ako "integer promotions" (co je rozsirenie mensich typov na int alebo
unsigned int) a naviac float sa rozsiri na double. Mimochodom, citat normu
v tomto bode je obzvlast neprijemne, pretoze je pisana s ohladom na K&R aj
"novy" styl deklaracie/definicie a pouzitia funkcii, a cele to nie je to
bez komentara prilis zrozumitelne. 

Ergo, va_arg a spol. vobec nerataju s tym, ze by v elipse bolo schovane
nieco mensie ako int (resp. double) a tak pri pokuse z tade vybrat nieco
mensie to ma pravo urobit cokolvek skarede, co je napokon potvrdene aj
priamo pri popise samotneho va_arg a spol v 7.15.1.1#2:
 If there is no actual next argument, or if type is not compatible with the
type of the actual next argument (as promoted according to the default
argument promotions), the behavior is undefined [... nasleduju 2 vynimky
ktore sa vsak netykaju tohto pripadu]

Je to zataz z minulosti, dana mechanizmom odovzdavania parametrov v K&R.
Nie zeby bolo technicky neriesitelne tie promotions nerobit, ale je to
pevne zakotvene v norme, tak sa s tym treba zmierit.

wek


----- Original Message ---------------

Subject: va_arg
   From: "Pavel Hudecek" <edizon at seznam.cz>
   Date: Fri, 22 Jul 2016 21:08:44 +0200
     To: "HW news" <hw-list at list.hw.cz>

>Dobrý den v±em,
>
>mějme funkci:
>
>void i2cSend(uint8_t adr, uint8_t bytes, ...) {
>va_list fPar;
>(....)
>sendData[index++] = va_arg(fPar, uint8_t);
>(....)
>}
>
>Na řádku sendData... vznikl následující warning a poznámky:
>
>warning: 'unsigned char' is promoted to 'int' when passed through '...'
>note: (so you should pass 'int' not 'unsigned char' to 'va_arg')
>note: if this code is reached, the program will abort
>
>Abych pravdu řekl, vůbec nevím co si o tom mám myslet. Znamená to, µe va_arg 
>neumí unsigned char a µe bude argumenty µrát po dwordech, nebo µe stačí, 
>kdyµ před va_arg dám (uint8_t) a jinak bude v±e OK?
>
>Díky,
>PH 
>


Daląí informace o konferenci Hw-list