Forum: Compiler & IDEs (void) oder ()


von derChef (Gast)


Lesenswert?

Hi,
Da ich anfange in C/C++ zu programmieren wollte ich wissen was denn eher 
dem "Standart" entspricht:
1
int bla(void);

oder
1
int bla();

Ich habe schon beides in freier Wildbahn gesehen...
Ich weiß das ist nur eine Kleinigkeit aber ich wollte mir von Anfang an 
das standardisierte, wenn es denn dafür einen Standart gibt, einprägen.

vielen Dank.
MfG

von Karl H. (kbuchegg)


Lesenswert?

derChef schrieb:
> Hi,
> Da ich anfange in C/C++ zu programmieren

Dann musst du dich entscheiden.
Entweder C
oder C++

Eine Programmiersprache namens C/C++ gibt es nicht. Und nein, die beiden 
Sprachen entfernen sich voneinander. Das C ein 100% Subset von C++ sei, 
ist mittlerweile ein Ammenmärchen.

> wollte ich wissen was denn eher
> dem "Standart"

Standard
       -

> entspricht:
>
1
int bla(void);

Das ist die C Version, die in C++ ebenfalls gültig ist.
Die Bedeutung ist: die Argumentliste von bla ist leer.

>
> oder
>
1
int bla();

Dieses C++ Konstrukt entspricht in allen Details der oben angegebenen 
C-Version.
Als C-Konstrukt hingegen bedeutet es etwas anderes. Nämlich das nichts 
weiter über die Argumente der Funktion bekannt ist und daher die 
C-Standard-Regeln zum tragen kommen, wenn es gilt, Argumente an die 
Funktion zu übegeben.

> Ich weiß das ist nur eine Kleinigkeit aber ich wollte mir von Anfang an
> das standardisierte, wenn es denn dafür einen Standart gibt, einprägen.
             ^                                         ^
Seltsam      |                                         |
             |                                         |
       hier hast du es richtig                 hier falsch

von derChef (Gast)


Lesenswert?

Danke für die Hilfe.

Karl heinz Buchegger schrieb:
> int bla(void);
> Das ist die C Version, die in C++ ebenfalls gültig ist.
> Die Bedeutung ist: die Argumentliste von bla ist leer.

Ok. Dann merke ich mir: Wenn eine Funktion keine Argumente 
entgegennehmen soll, schreibe ich explizit void in die Klammern.

Karl heinz Buchegger schrieb:
> Nämlich das nichts
> weiter über die Argumente der Funktion bekannt ist

Also int bla() heißt "keine Argumente oder Argumente unbekannt" ?
Wie kann man denn einer Funktion Argumente übergeben wenn sie als int 
bla(); deklariert ist?

Karl heinz Buchegger schrieb:
> Seltsam

Ich hatte nur einmal Glück...

von Rolf Magnus (Gast)


Lesenswert?

derChef schrieb:
>> weiter über die Argumente der Funktion bekannt ist
>
> Also int bla() heißt "keine Argumente oder Argumente unbekannt" ?

Ja.

> Wie kann man denn einer Funktion Argumente übergeben wenn sie als int
> bla(); deklariert ist?

So wie sonst auch. Nur hat der Compiler halt nicht die Möglichkeit, zu 
erkennen, ob deine Argumente die richtige Anzahl und Datentypen haben, 
und er hat auch keine Möglichkeit, ggf. Konvertierungen in die richtigen 
Typen durchzuführen. Er muß dem Aufrufer blind vertrauen.
Wenn du die Funktion z.B mit blah(5); aufrufst, geht der Compiler davon 
aus, daß die Funktion wohl einen int haben will und übergibt diesen.
Das ganze stammt noch Von Früher(tm) und sollte heute nicht mehr 
verwendet werden, also bei leerer Parameterliste immer (void) angeben.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Falls sich die Frage mehr darauf bezog, wie man denn die Argumente
in diesem Falle auswertet, dann hier noch als (historische)
Ergänzung:

Die Deklaration lautet, wie schon genannt:
1
int foo();

Die kann man bspw. in eine Headerdatei schreiben, damit der Compiler
weiß, dass es am Ende im Projekt irgendwo eine Funktion namens foo()
gibt.  (*)

In irgendeiner der Quelldateien steht dann die Definition für
foo(), und die könnte beispielsweise folgendermaßen aussehen:
1
int
2
foo(argc, argv)
3
    int argc;
4
    char **argv;
5
{
6
   /* do something */
7
   return 42;
8
}

Selbstverständlich war (ist) das ganze Verhalten nur definiert, wenn
der Aufrufer dann auch mit Parametern passender Typen (also "int" und
"char **") aufgerufen hat, aber wie Karl Heinz schon schrieb, der
Compiler hatte halt keine Chance, das noch zu überprüfen, und zuweilen
wurde das dann auch missbraucht, um eine implizite Typkonvertierung
gleich noch mit durchzudrücken.

Aber wie schon geschrieben, seit ANSI-C89 ist das Geschichte und
sollte da bleiben, wo es hingehört: in historischem C-Code.  Man
sollte es halt noch kennen, damit man ganz altes C lesen kann.
Benutzen sollte man das im 3. Jahrtausend nicht mehr.

(*) Ganz Faule haben die Deklaration auch noch weggelassen, und der
Compiler hat die Faulheit unterstützt, indem er beim Aufruf einer
nicht deklarierten Funktion implizit "int" als Rückkehrtyp angenommen
hat.  Dazumals war außerdem ein "int" praktisch noch komplett mit
einem beliebigen Zeiger austauschbar, sodass man, bis auf
float/double, eigentlich komplett ohne Funktionsdeklarationen auskam,
wenn man schön schlampig programmieren wollte. ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.