va_arg

Pavel Hudecek edizon na seznam.cz
Sobota Červenec 23 11:26:23 CEST 2016


Díky za podrobné vysvětlení.

Takľe teď tam mám:

uint8_t sd[10];
uint8_t *sendData;
(...)
sendData=sd;
(...)
sendData[index++] = (uint8_t)va_arg(fPar, uint32_t);

Funguje a negeneruje warningy.

A o kousek dál, kde chci přenáąet pole, na které byl předán pointer, je:

sendData=(uint8_t *)va_arg(fPar, uint32_t);

Taky funguje bez protestů.
Je to tak správně, nebo je v tom nějaký potenciální zádrhel?

PH

-----Původní zpráva----- 
From: Jan Waclawek
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.

----- Original Message ---------------
Subject: va_arg
   From: "Pavel Hudecek" <edizon na seznam.cz>
>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? 



Daląí informace o konferenci Hw-list