main() rekursiv ;-)
-
Im Standard steht sogar dass es verboten ist

-
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { cout << "hallo" << endl; system(argv[0]); return 0; }Daran hat bestimmt niemand gedacht, das zu verbieten

-
3.6.1 Main function: ...
"The function main shall not be used (3.2) within a program."3.2 One definition rule
-
shall not -> sollte nicht oder?
must not -> darf nicht
-
In diesem Falle eher "shall not" im Sinne von "so solle es sein"
Klar, dürfen darfst Du vieles, auch über Arraygrenzen hinwegschreiben
- nur dass das dann keinen definierten Effekt hat.
-
In dem Fall ist es ein Gebot, aber die kann man misachten (genauso wie man sich auch nicht an den Standard halten kann). Ob das gut ist, muss jeder selber wissen.
-
Ein standardkonformer Compiler muss zumindest warnen. MSVC++ 2005 auf Warnstufe 4:
warning C4717: 'main' : recursive on all control paths, function will cause runtime stack overflow
-
Storm.Xapek.de schrieb:
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { cout << "hallo" << endl; system(argv[0]); return 0; }Daran hat bestimmt niemand gedacht, das zu verbieten

Hier wird auch nicht main( ) direkt aufgerufen, sondern auch der (vom Compiler generierte) Code, der main( ) "bootstrapt".
Greetz, Swordfish
-
Erhard Henkes schrieb:
Ein standardkonformer Compiler muss zumindest warnen. MSVC++ 2005 auf Warnstufe 4:
Naja, er warnt ja nicht vor Aufrufen von main, sondern vor einem drohenden Stack-Overflow...
xeatre-devel:~/src# g++-4.1 -Wall -W -pedantic -std=c++98 main.c main.c: In function 'int main()': main.c:3: error: ISO C++ forbids taking address of function '::main'
-
Erhard Henkes schrieb:
Ein standardkonformer Compiler muss zumindest warnen.
Seit wann denn das? Ich dachte warnings seien ne freiwillige Sache der Compiler-hersteller?
-
Soweit ich weiß ist main() auch nichts anderes als eine normale Funktion. Aber von main() mal abgesehen, welchen Nutzen hat eine Rekursion ohne Abbruchbedingung?
-
sascha_kib schrieb:
Soweit ich weiß ist main() auch nichts anderes als eine normale Funktion.
Das ändert aber nichts am Standard, welchen Erhard Henkes vollkommen richtig zitiert hat.
Greetz, Swordfish
-
hggdgdg schrieb:
Seit wann denn das? Ich dachte warnings seien ne freiwillige Sache der Compiler-hersteller?
Oftmals verwenden Compiler aber auch Warnungen bei Sachen, die zwar gegen den Standard verstossen, sich dennoch kompilieren lassen. Es heisst dann halt: Compilererweiterung.

Merke: nur weil es eine Warnung ist, bedeutet das noch lange nicht, dass du die Meldung ignorieren darfst.
-
Warnungen sind für mich (fast) wie Fehler
Also. FIXEN!
-
Nicht nur für Dich - ich muss regelmäßig meine Betatester beschwichtigen dass meine #warning's FÜR MICH gedacht sind und nicht wirklich auf Fehler hindeuten

-
groovemaster schrieb:
hggdgdg schrieb:
Seit wann denn das? Ich dachte warnings seien ne freiwillige Sache der Compiler-hersteller?
Oftmals verwenden Compiler aber auch Warnungen bei Sachen, die zwar gegen den Standard verstossen, sich dennoch kompilieren lassen. Es heisst dann halt: Compilererweiterung.

Merke: nur weil es eine Warnung ist, bedeutet das noch lange nicht, dass du die Meldung ignorieren darfst.
Das ändert aber nix daran, daß es falsch ist, daß ein standardkonformer Compiler warnen *muss*.
-
Jester schrieb:
Das ändert aber nix daran, daß es falsch ist, daß ein standardkonformer Compiler warnen *muss*.
Doch, muss er (wenigstens). Ansonsten wäre er ja nicht mehr standardkonform.
