pre-ANSI-C: Funktionen mit weniger Parametern aufrufen als in Deklaration
-
Hallo,
ich habe einen Code bekommen, der wohl unter IRIX/ SGI kompiliert, den ich nun u.a. nach Linux portieren soll. An mehrere Stellen tauch Konstrukte der folgenden Art auf:
int foo (int a, int b, int* c); int main() { int a = 3; int b = 4; foo(a,b); }
D.h., die Funktion foo wird mit 3 (oder mehr) Parametern deklariert, ohne default-Werte, und dann mit weniger Parametern im Code aufgerufen.
Laut ANSI-C funktioniert das nicht, und der Compiler (gcc) beschwert sich entsprechend.
Der alte Code wurde wohl, wenn ich es richtig gesehen habe, mit dem Schalter '-traditional' kompiliert, doch selbst im K&R-Buch habe ich nichts ueber das Verhalten bei so einem Konstrukt gefunden.
Kann mir jemand sagen, die ein Compiler, bevorzugt der C-Compiler unter IRIX (zu dem ich keinen Zugang habe), mit so einem Konstrukt umgeht? Werden die Parameter ignoriert, oder werden ihnen default-Werte zugeordnet?
Vielen Dank, Tim
-
Hi,
default-Werte gibt's in C nicht (jedenfalls ist mir nichts davon bekannt). Bei dem angegebenen Codefragement wäre es eine Möglichkeit, für den Pointer noch 0 (oder NULL) mitzugeben. Allerdings lässt du den Parameter nicht wirklich weg...
Auf der anderen Seite kannst du mit der so genannten Ellipse arbeiten:
int foo(int x, ...) { }
Dann musst du nur für x einen int-Wert angeben und der Rest steht dir frei.
printf macht das ja genauso. Siehe hier für mehr Details: http://www.pronix.de/pronix-629.html
MfG
GPC
-
tim_g schrieb:
Werden die Parameter ignoriert, oder werden ihnen default-Werte zugeordnet?
weder/noch. da steht dann irgendwas unvorhersehbares drin
in den vorhandenen parametern sollte irgendwo die information drinstecken, dass die nichtvorhandenen keine bedeutung haben. z.b.void f (int a, int b, int c) { switch (a) { case 1: // benutze nur 'b' ... break; case 2: // benutze 'b' und 'c' ... break; ... ... }
-
net schrieb:
weder/noch. da steht dann irgendwas unvorhersehbares drin
in den vorhandenen parametern sollte irgendwo die information drinstecken, dass die nichtvorhandenen keine bedeutung haben.Das habe ich befuerchtet. Kennt jemand zufaellig eine Stelle, wo dieses Verhalten erwaehnt bzw. dokumentiert ist. Wenn ich bei SGI nachschaue, komme ich nur zu einer ANSI-C Referenz, und ANSI-C ist das ja wohl nicht.
-
tim_g schrieb:
Das habe ich befuerchtet. Kennt jemand zufaellig eine Stelle, wo dieses Verhalten erwaehnt bzw. dokumentiert ist.
im ansi c spec (6.5.2.2 absatz 6) steht:
...
If the number of arguments does not equal the number of parameters, the
behavior is undefined.
...das wort 'undefined' kommt ca 180 mal vor in dem text