mikrocontroller.net

Forum: Compiler & IDEs (void) oder ()


Autor: derChef (Gast)
Datum:

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

oder
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
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
>
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

Autor: derChef (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
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:
int
foo(argc, argv)
    int argc;
    char **argv;
{
   /* do something */
   return 42;
}

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. ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.