mikrocontroller.net

Forum: Compiler & IDEs Hello World ohne ;


Autor: CChecker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

mir hat mal ein Kollege in meiner alten Firma ein "hello world"-Programm 
gezeigt, dass ohne ; auskam. Leider find ich die Mail nicht mehr. Kann 
mir von Euch da einer weiter helfen? Mein neuer Kollege will mir einfach 
nicht glauben, dass das mit der normalen C-Syntax funktioniert. Danke 
schonmal.

Autor: Markus E. (engelmarkus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So:
#include <stdio.h>

void main() {
 if (printf("Hello World")) {
 }
}

;) printf ist schließlich eine normale Funktion... sie gibt als Wert die 
Anzahl der geschriebenen Zeichen zurück.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist aber kein Standardkonformes C-Programm, weil der Return-Typ von 
main() nicht int ist.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Ist aber kein Standardkonformes C-Programm, weil der Return-Typ von
>
> main() nicht int ist.Beitrag melden | Bearbeiten | Löschen |
#include <stdio.h>

int main() {
 if (printf("Hello World")) {
 }
}

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt fehlt das return-Statement.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es fehlt nicht. Man darf es hier weglassen. Das entspricht dann einem 
return 0. Das ist eine spezielle Ausnahme, die nur für main() gilt.
Ich hab nie verstanden, wozu diese spezielle Ausnahme gut sein soll, 
aber jetzt weiß ich es: Damit man ein C-Programm ohne Semikolon 
schreiben kann ;-)

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Es fehlt nicht.

gcc main.c -o main.exe -Wall
main.c: In function `main':
main.c:6: warning: control reaches end of non-void function

Naja dürfen darf man schon, aber ob das sauberes Programmieren ist...

Autor: Wolfgang Bengfort (et-tutorials) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
;-)
Den kannte ich nocht nicht.
Hello world ohne Semikolon ... , tse, tse.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark Brandis schrieb:

> gcc main.c -o main.exe -Wall
> main.c: In function `main':
> main.c:6: warning: control reaches end of non-void function

Probier's mal mit:

gcc main.c -o main.exe -Wall -std=c99

> Naja dürfen darf man schon, aber ob das sauberes Programmieren ist...

In ISO-C ist exakt definiert, was dann passiert.
Aber du darfst gerne eine Lösung vorstellen, die das return enthält, 
wenn du kannst ;-)

Autor: Malte __ (malte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen direkten Weg zum Festlegen des Returnwertes habe ich nicht 
gefunden, indirekt geht das aber.
#include <stdio.h>

int main() {
  if (printf("Hello world\n")) {
  }
  if (getchar() == 'A') {
    if (printf("")) { //returns 0
    }
  } else {
    if (printf("\r")) { //returns 1
    }
  }
}
Danach echo $? auf der Konsole eingeben.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Malte __ schrieb:
> Einen direkten Weg zum Festlegen des Returnwertes habe ich nicht
> gefunden, indirekt geht das aber.

So, aber nicht, denke ich.
Wo im Code "returns"  steht wird der Rückgabewert zum Ergebnis der 
Auswertung der Bedingung. Mit dem vom "return" Befehl "zurückgegebenen" 
Ergebniswert des Programms hat das nichts zu tun.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, wenn der Compiler den Code so erzeugt, daß eine int-Funktion
immer in einem bestimmten Register ihren Wert zurückgibt,
dann steht der Rückgabewert von printf in eben diesem.
Wenn man in main() kein return hat, steht der Wert von printf
da immer noch drin und letztlich liefert main dann den
letzten Rückgabewert von printf.

Portables Programmieren sieht freilich anders aus.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Liest eigentlich keiner, was ich schreibe? In ISO-C ist genauestens 
definiert, was passiert, wenn main() ohne return-Anweisung verlassen 
wird: Es wird 0 zurückgegeben. Egal, was printf für einen Returnwert 
hatte.

PS: Es kann sein, daß man dazu dem gcc mit -std=c99 sagen muß, daß er 
den Code nicht auf Basis einer seit 11 Jahren veralteten Version von C 
übersetzen soll.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gelesen habe ich es wohl ... :-)

Du magst ja auch Recht haben. In C++ und (das wusste ich bisher
nicht, aber mag gut sein) ISO-C99 ist kein return so gut wie
return 0.

Aber nur zur Sicherheit: In K&R-C und dem doch noch recht gängigen
ANSI-C ist es eben nicht so.

MS Visual C++ z.B. ist i.W. ANSI-C und hat mit ISO-C99 nicht
viel am Hut.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Aber nur zur Sicherheit: In K&R-C und dem doch noch recht gängigen
> ANSI-C ist es eben nicht so.

Das stimmt. Diese C-Varianten sind allerdings schon seit so langer Zeit 
veraltet, daß ich die nicht weiter in Betracht ziehe. Sie sind für mich 
Geschichte.

> MS Visual C++ z.B. ist i.W. ANSI-C und hat mit ISO-C99 nicht
> viel am Hut.

Eigentlich blöd, denn C89/C90 hat mit Erscheinen von C99 seine 
Gültigkeit verloren. Man kann die Definition seither auch nicht mehr von 
offizieller Stelle kaufen. Meiner Meinung nach taugt ein C-Compiler nix, 
wenn er nach 11(!) Jahren C99 immer noch nicht wenigstens einigermaßen 
implementiert hat.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> MS Visual C++ z.B. ist i.W. ANSI-C und hat mit ISO-C99 nicht
> viel am Hut.

welche Version?
Ich habe es gerade mit der 2003 getestet und da kommt keine Warnung oder 
ein Fehler.

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

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Es kann sein, daß man dazu dem gcc mit -std=c99 sagen muß, daß er
> den Code nicht auf Basis einer seit 11 Jahren veralteten Version von C
> übersetzen soll.

Ja, muss man.  Default ist -std=gnu89.  Dafür gibt's dort aber dann
auch eine Warnung:

foo.c:7: warning: control reaches end of non-void function

Die gibt es mit -std=c99 oder -std=gnu99 nicht.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Klaus Wachtler schrieb:
>> MS Visual C++ z.B. ist i.W. ANSI-C und hat mit ISO-C99 nicht
>> viel am Hut.
>
> welche Version?
> Ich habe es gerade mit der 2003 getestet und da kommt keine Warnung oder
> ein Fehler.

Du hast was getestet?
Wenn wegen des fehlenden return kein Fehler kommt, heißt das
noch lange nicht, daß VC++ nennenswert C99-konform wäre.
Mein letzter Stand dazu ist VS2005; das ist von C99 meilenweit
entfernt.
Meines Wissens hat sich seither in diesem Punkt nicht viel
getan, ich lasse mich aber auch gern eines besseren belehren.

Jedenfalls ist es so, daß dank VC++ leider nicht C99 als
komplett eingeführt betrachtet werden kann - auch wenn es
anders sein sollte.

Ein Erlebnis der anderen Art war mal ein Programm, das woanders
entstand und eigentlich für ISO-C99 gedacht war.
Wenn ein Compiler dann sowas wie isnan() nicht kennt, meckert
er halt und man mogelt sich drum rum.
Dann verhielt sich das Ding aber recht schrullig.
Mit etwas Suche kam dann raus, daß NAN (lt. C99 ein Wert einer
ungültigen FP-Zahl) im Quelltext verwendet wird, der Compiler
sich nicht dran stört (weil es zufällig in irgendeiner
Headerdatei definiert war, ich glaube xwindows.h o.s.ä.),
nur leider nicht im Sinne einer "not a number" sondern mit
dem Wert 2. Genau: #define NAN 2...
Soviel zum Thema MS und Konformität.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, das gibt mir irgendwie zu denken. Einerseits hat Microsoft 
jemanden, der im Komitee sitzt und an neuen Versionen der Norm 
mitarbeitet, andererseits haben sie keinerlei Interesse, das dort 
beschlossene dann auch in ihren Compiler zu integrieren, wenn nicht 
irgendwelche Benutzer explizit danach fragen. Was um alles in der Welt 
haben die dann im Komitee verloren?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Was um alles in der Welt
> haben die dann im Komitee verloren?
Wenig.

Dass die Namen der beiden Funktionen in snprintf() (ISO-C) und 
_snprintf() (Microsoft) zum Verwechseln ähnlich sind, obwohl _snprintf() 
sich nicht wie snprintf() verhält (und sich auch gar nicht so verahlten 
soll), ist sicherlich auch rein zufällig.

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

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Was um alles in der Welt
> haben die dann im Komitee verloren?

Bremsen.

Im Ernst: Seit sich MS den Mike Suttner eingekauft hat (ein geachtetes 
Member des C++ Komitees) ist es mit ihrem C++ Compiler stark bergauf 
gegangen. Ich kann nur hoffen, dass es in C auch so sein wird, dass man 
irgendwann wieder auf die Anlassprogrammierung verzichtet und die Dinge 
von Grund auf korrigiert.

MS versucht halt momentan die ganze Welt auf C# und .Net zu ziehen. C 
Programmierung ist unter Windows sowieso eine Qual und den C++ Zug macht 
man nur deswegen noch mit, weil es da draussen genug Rebellen gibt, die 
C#, Managed-C++ oder VB einfach verweigern. Und das kann sich eine Firma 
wie MS dann doch nicht leisten, auf diese Leute zu verzichten. Das 
kleine Grüppchen der Leute, die mit C an Windows rangehen, ist, so denke 
ich, für MS hingegen verschmerzbar.

Autor: Andreas Kanzler (scavanger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

du vergisst die Leute die Hardware nah programmieren (Treiber & Co.).
Da geht mit .net bekanntlich gar nichts. Das hat nicht mit Verweigerung 
zu tun, sondern mit einer technischen Notwendigkeit und hauptsächlich 
dafür werden die C(++) Compiler weiterhin entwickelt.

Und unterschätze C nicht. Hier an der FH wird ziemlich laut auf C++ 
geschimpft. In C++ programmiert hier kaum mehr jemand. Die GUI-Sachen 
werden in C# oder Java gemacht, die Hardware nahen Dinge in reinem C.

Autor: Bartli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hier an der FH wird ziemlich laut auf C++
> geschimpft. In C++ programmiert hier kaum mehr jemand

Jaja, hab auch mal an ner FH gearbeitet, dort haben auch alle aus der 
Abteilung Elektrotechnik auf C++ geschimpft. Langsam, gross, nicht 
geeignet für Micros usw. usf. Hast du echt mit den Leuten geredet so hat 
sich dann normalerweise rausgestellt dass für die C++ wie C ist, nur 
"mit Klassen" und cout anstatt printf.

Autor: Bartli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja...mein gcc kompiliert folgendes mit -std=c89 -Wall ohne zu 
meckern:
#include <stdlib.h>
#include <stdio.h>

int main()
{
  if (printf("hello, world\n")) {}
  if (exit(23), 42) {}
}

Vorteile:
* Keins dieser verdammten Semikolons
* Rückgabewert definiert (23)

Autor: Bartli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist der Prototyp von exit, der's möglich macht:
_VOID  _EXFUN(exit,(int __status) _ATTRIBUTE ((noreturn)));

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.