"cout" vor Main Funktion
-
Ok danke. Also ich versuchs nunmal so zu beschreiben wie ich es jetzt verstehe:
1.) Durch Zeile 6: int __test_main__(); weiß er, dass es eine Funktion __test_main__() gibt.
2.) In Zeile 10 führt er sie aus
3.) Durch Zeile 12 weiß er dass die Main funktion imt cout << "hallo aus der main" die __test_main__() istrichtig?
Wobei für mich immer noch die Frage ist, wieso der erste Post nicht kompiliert wird. Die Erklärung "Weil er halt zuerst nach der Main sucht" reicht bei meinem Wissensstand (leider) nicht aus. Wie gesagt in meiner Welt hat das doch erstmal nicht damit zu tun, wieso er da so rummeckert.
Anders gefragt: Ist das Problem, dass das "Cout" einfach so im Raum steht und in keiner Funktion steht? "Muss" ein Cout immer in einer Funktion stehen. Wenn nein was darf außerhalb einer Funktion stehen?
#define, #ifndef, #ifdef, #include, globale Variablen, sonst nix?Danke
-
Suchst du vielleicht eigentlich nach
#ifdef TEST # error "TEST schon definiert." #else # define TEST #endif?
-
Zenker schrieb:
Anders gefragt: Ist das Problem, dass das "Cout" einfach so im Raum steht und in keiner Funktion steht? "Muss" ein Cout immer in einer Funktion stehen. Wenn nein was darf außerhalb einer Funktion stehen?
#define, #ifndef, #ifdef, #include, globale Variablen, sonst nix?
DankeSchau mal hier: Hyperlinked C++ BNF Grammar
Allerdings würd ich mir an Deiner Stelle nicht so den Kopf darüber zerbrechen, was Zinkens code genau macht (da wie schon erwähnt eher n mieser Trick).
-
Sowas wäre eine Lösung, aber Dein Quelltext wird bei mir nicht übersetzt (C1189)
-
Was willst du eigentlich genau machen? Sei präzise, denn bislang sah ich hier nur Sachen, die man nie im Leben so verwenden wird.
-
Danke, hab mir gerade mal BNF überflogen und mir den Wiki Artikel dazu durchgelesen... Hab aber noch nicht so ganz kapiert was die BNF ist, ist sie die "Grammatik der Compiler?"
Werd den kompletten Artikel wohl morgen mal nach dem Aufstehen durchlesen.
Dank euch allen schonmal
-
Also ok, ich veruschs nohchmal zu anders zu formulieren:
Ich habe in einem anderen Forum einen Quelltext gefunden, der in etwa so aussieht:
#include <iostream> using namespace std; #define test #ifdef test cout << "dies ist ein tes"; //oder std::cout #else #define test #endif int main(void) { }Die Idee des Authors ist wohl, zu prüfen ob test schon definiert ist und wenn ja eine Meldung darüber auszugeben (wohl zu testzwecken).
Dieser Code wird von meinem Compiler nicht übersetzt und ich frage mich wieso. Kommentiere ich die Cout Zeile nach #ifdef aus, wirds ja übersetzt. Eine funktionierende Version ist für mich zweitrangig. Ich frage mich nur wieso dieser Quelltext eigentlich nicht übersetzt wird. Mir, als Mensch, ist die Idee des Authors des Quelltextes ja klar.
-
Das wäre auch eine Möglichkeit, aber das alles finde ich mehr oder minder quatsch. MSVC highlighted dir sogar den definierten Bereich.
#include <iostream> #define test #ifdef test #define testdefine "test ist definiert" #else #define testdefine "test nicht definiert" #endif int main() { std::cout << testdefine; }
-
Ok, die Lösung sieht für mich schonmal sehr gut aus und wird das machen, was ich erwarte.
Danke.
Aber cout DIREKT im #define Teil ist VERBOTEN / nicht erlaubt, richtig?
Wie gesagt wichtiger als eine funktionierende Lösung ist für mich der Grund, wieso der Ursprungsteil nicht kompiliert wird.
-
Zenker schrieb:
Dieser Code wird von meinem Compiler nicht übersetzt und ich frage mich wieso. Kommentiere ich die Cout Zeile nach #ifdef aus, wirds ja übersetzt. Eine funktionierende Version ist für mich zweitrangig. Ich frage mich nur wieso dieser Quelltext eigentlich nicht übersetzt wird. Mir, als Mensch, ist die Idee des Authors des Quelltextes ja klar.
C++ erlaubt allgemain keine Anweisungen außerhalb von Funktionen. Wenn wir mal den Präprzessor weglassen, sieht das Programm so aus:
#include <iostream> std::cout << "Test"; int main() { }Und sowas ist in C++ nicht möglich, egal ob die Anweisung
cout << ...;,Sleep(5000);oder sonstwie lautet.Wann sollen solche Anweisungen auch ausgeführt werden? Am Start des Programms? Was ist, wenn über verschiedenste Dateien solche Anweisungen verteilt sind, in welcher Reihenfolge werden die dann ausgeführt? Von Übersichtlichkeit will ich mal gar nicht reden, auf jeden Fall gibt es einen Grund für die Funktion
main.Natürlich gibt es wie immer Ausnahmen: die Konstruktoren globaler oder statischer Variablen werden vor
mainin einer unspezifizierten Reihenfolge ausgeführt. Man kann also Code vormainausführen. Für solche Fälle sollte man das aber nicht benutzen.Übrigens gibt es auch die Möglichkeit, über Präprozessordirektiven dir beim Kompilieren Meldungen im Kompilierlogfenster des Compilers ausgeben zu lassen, das wäre in dem Fall wahrscheinlich angebrachter (die genauen Direktiven müsste ich jetzt aber erst nachsehen (war glaube ich sowas wie
#pragma message), kommt sicher auch auf den Compiler an).
-
Naja man könnte ja sich denken, dass er die ganzen Präprozessorbefehle die vor der Main stehen Zeile durchgeht. Das cout gehört ja zu #ifdef und steht ja nicht im leeren Raum.
Der Fehler würde dann ja zur Compilezeit auftreten (hatte ich nicht bedacht) und damit gäbs ja garkein Terminal, auf was cout ausgeben könnte. Ich denke mir ist nun alles klar.Danke
-
Der Präprozessor ist unabhängig vom Compiler. Der Compiler bekommt von den Präprozessordirektiven (z.B.
#ifdef) nichts mit, die hat der Präprozessor entfernt. Für den Compiler steht dascoutalso schon im "leeren Raum".Das mit dem Terminal ist auch irrelevant, folgendes Programm kompiliert ebenso nicht:
void do_nothing() {} do_nothing(); // <-- Fehler int main() {}Anweisungen außerhalb von Funktionen sind in C++ ganz einfach nicht erlaubt.