[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [RFR] man://manpages-de/stdarg.3



* Chris Leick <c.leick@vollbio.de> [110121 09:55]:
>>> "If there is no next argument, or if I<type>  is not compatible with the type "
>>> "of the actual next argument (as promoted according to the default argument"
>>> "promotions), random errors will occur."
>>> msgstr ""
>>> "Wenn es kein weiteres Argument gibt oder wenn I<typ>  nicht kompatibel mit "
>>> "dem Typ des n??chsten Argumentes ist (wie es entsprechend der"
>>> "Standardargumente bef??rdert wird), erscheinen zuf??llige Fehler."
>>
>> Es werden nicht die Standardargument befördert,
>
> was ich ja auch nicht schreib ("entsprechend").
>
>  sondern es sind die
>> Standardregeln wie Typen von Argumenten verändert werden.
>
> Dass die Typen der Argumente geändert werden, kann ich hier allerdings
> nicht finden. »ap« wird so geändert, dass es den Typ des nächsten
> Arguments hat. Da dies fortlaufend über die ganze Liste wiederholt wird,
> schlage ich vor es etwas freier mit »an der Reihe ist« zu übersetzen.

Ein Beispiel:

| #include <stdio.h>
| #include <stdarg.h>
|
| int got(int dummy, ...) {
|         short s;
|         va_list ap;
|
|         va_start(ap, dummy);
|
|         s = va_arg(ap, short);
|         va_end(ap);
|         return s;
| }
| int main() {
|         short s = 7;
|         printf("%d\n", got(0, s));
|         return 0;
| }

Wenn man das kompiliert, bekommt man folgende Fehlermeldung:
t.c: In function ‘got’:
t.c:10: warning: ‘short int’ is promoted to ‘int’ when passed through ‘...’
t.c:10: note: (so you should pass ‘int’ not ‘short int’ to ‘va_arg’)
t.c:10: note: if this code is reached, the program will abort

Das Problem ist, dass wenn man ein short als variables Argument übergibt,
es automatisch nicht als short, sondern als int übergeben wird. Diesen Vorgang
nennt man "argument promotion".

Das würde bedeuten, dass der obige Fall auf etwas als short zugreifen würde,
was ein int ist, das angegebene "short" also nicht kompatibel zu den übergebenen
Typ "short" ist, nachdem 'argument promotion' auf den Typ angewendet wurde.

Netterweise weigert sich gcc hier, dass so zu kopilieren und baut sogar ein
'abort' ein, damit man nicht ausversehen so ein Zeug baut, weil es völlig
zufällige Ergebnisse zur Folge hätte (auf little endian würde es für Ganzzahlen
vielleicht tun, auf big endian nicht, usw usf).

>>> "[...] Some systems that do not "
>>> "supply B<va_copy>()  have B<__va_copy> instead, since that was the name used "
>>> "in the draft proposal."
>>> Einige Systeme, die kein "
>>> "B<va_copy>() bereitstellen, haben stattdessen B<__va_copy>, da das der "
>>> "gleiche Name ist, der im Entwurfsvorschlag benutzt wurde."
>>
>> ", da dies der Name ist, der im ursprünglichen Vorschlag verwendet wurde."
>
> Draft ist ein Entwurf, ein Konzept oder eine Skizze. »Ursprünglich« passt
> hier meiner Meinung nicht.

Hier ist "draft" meiner Meinung nach ein Fachterminus für eine veröffentlichte
'offiziell' herausgegebene Vorversion des C Standards, was ein gewisser Schritt
des Standardisierungsprozesses ist. Ich vermute "draft proposal" meint hier
einen Vorschlag, was in den nächsten Standard soll, sprich was in einen solchen
'draft' eingebaut werden soll, damit es in den Standard kommen kann.
All diese Konnotationen gehen bei "Entwurfsvorschlag" meiner Meinung nach
völlig verloren, so dass "Entwurfsvorschlag" aus meiner Sicht nur noch ein
komisch klingender Begriff ohne jede Bedeutung ist.

Insofern sollte es entweder soetwas wie
"[Name], der im in den Standardisierungsprozess ursprünglich
eingebrachten Vorschlag verwendet wurde"
sein oder kurz "[Name], der im ursprünglichen Vorschlag verwendet wurde."

	Bernhard R. Link


Reply to: