Peter Sørensen <spam_ps@mail.tele.dk> skrev:
>> <URL:
http://www.eskimo.com/~scs/C-faq/s15.html>
>
> Takker for det hurtige svar.Der er dog en ting mere som jeg er i tvivl om.
> Da den beskrevne metode henter argumenterne ud som void pointers,
Du skal selv vide typen af argumentet og angive den som anden
argument i va_arg makroen.
> så kan jeg
> ikke se om argumentet et en signed/unsigned char, short int eller long int
> (eller andre typer for den sagsskyld).
Argumentet kan aldrig være en char eller short int. Det skyldes at
C laver "default argument promotions" ved funktionskald når
argumenttyperne ikke er angivet i en prototype.
> Printf ser at der er et argument som
> er heltal når den møder %d, men hvordan kan man, som printf, se hvilken
> slags heltal der er tale om?
printf()-funktionerne bruger en length modifier (hh = char, h =
short, l = long, ll = long long, j = intmax_t, z = size_t, t =
ptrdiff_t, L = long double) i formatstrengen til at angive
størrelsen. De typer som er kortere end en int, konverteres ved
funktionskaldet til int-størrelse, men konverteres tilbage af
printf().
> Hvis funktionen kaldes med en char, jeg får en void pointer til den og
> typecaster den til en long int, så er problemet der.
Ja, det giver udefineret adfærd og er uportabelt hvis det måtte virke
nogetsteds.
> Hvad er løsningen på det?
Skriv "int" som type i va_arg hvis funktionen er kaldt med en char,
da en char bliver konverteret til en int ved kaldet.
> Jeg kan naturligvis lave et formateringssystem alla %dui betydende unsigned
> int, men da det virker som om printf kan klare sig uden, ville jeg høre om
> nogen kender til en mere elegant løsning.
printf() klarer sig ikke uden. Læs om hvordan printf()'s
formatstreng er opbygget med felter til flag, bredde, præcison,
længde, type i din manual, lærebog eller hvad du nu har.
--
Skal musik- og edb-industrien have ret til fratage forbrugerne deres
rettigheder i henhold til Ophavsretloven, begrænse konkurrencen og
fremme monopoldannelse ved hjælp af tekniske midler? Sig nej! Nu!
Støt underskriftsindsamlingen på
http://www.digitalforbruger.dk