[OSy] include stdarg.h pri -nostdinc
Martin Decky
decky at d3s.mff.cuni.cz
Tue Oct 29 07:01:15 CET 2013
Hezky den,
> Druhe reseni, ktere se nabizi, je pridat prislusne definice primo do
> kodu:
>
> typedef __builtin_va_list __gnuc_va_list;
> typedef __gnuc_va_list va_list;
> #define va_start(v,l) __builtin_va_start(v,l)
> #define va_end(v) __builtin_va_end(v)
> #define va_arg(v,l) __builtin_va_arg(v,l)
> #define va_copy(d,s) __builtin_va_copy(d,s)
Toto reseni mi prijde v souladu se zadanim a navic je dostatecne
elegantni (v kodu se pouziji genericke prenositelne identifikatory,
pouziti konkretnich __builtin funkci specifickych pro dany prekladac tak
bude odabstrahovano).
> Problem tohoto druheho reseni je zrejma ne-zcela prenositelnost mezi
> kompilatory
Zkusenost rika, ze pri implementaci kernelu nebo zakladnich run-time
knihoven (libc apod.) neni vzdy mozne zajistit 100% prenositelnost mezi
prekladaci.
Souvisi to s tim, ze norma jazyka C mnohe veci zamerne vubec nedefinuje
(nebo je definuje jako implementation-specific), ovsem v techto
konkretnich pripadech je nutne respektovat dane ABI a vygenerovat kod,
ktery presne odpovida konkretnim pozadavkum. K tomu je casto nutne
pouzit nestandardni konstrukce specificke pro dany prekladac (builtin
funkce, atributy, inline assembler atd.).
I tak je pochopitelne mozne spat kod rozumne prenositelny, tj. maskovat
rozdily mezi prekladaci pomoci abstrakci v kodu, podminenym prekladem
apod. Jen takovy kod nebude nutne automaticky prenositelny na nove a
dosud nezname prekladace.
Cilem je, aby byl maximalne prenositelny mezi prekladaci koncovy
uzivatelsky kod (aplikaci), ktery uz pochopitelne nema potrebu zabyvat
se low-level vecmi jako v kernelu nebo v run-time knihovnach.
M.D.
More information about the NSWI004
mailing list