gängige Anfänger-Fehler?
-
Hallo Leute!
Ich stelle gerade eine Liste von Anfänger-Fehlern zusammen und was der Compiler dazu sagt (gcc, bcc, vc++)
Bitte ergänzt die Liste mit dem was euch noch einfällt:
; vergessen
Variable in einem case definiert, aber keinen Block aufgemacht
Klasse obj(); statt Klasse obj;
vector<int>::const_iterator i; vec.erase(i);
void bar(T&); T const& r=foo; bar(r);
T* p; p.foo();
T& foo() { T t; return t; } (kein Fehler, aber Warnung)
string name="foo"; ofstream file(name);
funktion, klasse, whatever bereits definiert (ODR verletzung)
unresolved external reference to... (lib vergessen zu linken/vergessen zu implementieren)
void foo(); { cout<<"hallo"; } (; nach funktionskopf)
std:: vergessen (namensraum)
class foo { int i=3; }; (i nicht im ctor initialisiert)
class foo {} (; nach deklaration vergessen)Was ich damit bezwecken will: ich will die Fehlermeldungen die GCC, BCC und VC++ dabei generieren aufschreiben, so dass es für einen Anfänger leichter ist, sich mit den Fehlern die, der Compiler liefert, vertraut zu machen. Hierbei geht es aber nur um Anfängerfehler - und nur die gängigsten (bzw. die am schwersten zu verstehensten).
Es wäre also nett, wenn ihr ein paar Fehler beisteuern könntet
danke!
-
Hi,
was mir schon ein paar mal passiert ist:
if(....); wird_ja_nie_aufgrund_der_bedingung_ausgefuehrt();
Weiss jetzt allerdings nicht, ob der Compiler ne Meldung wirft.
switch(x) { case a: //anweisungen break; case b: int i = 5; //variablendefinition innerhalb switch-block //hier muss natuerlich dann ein neuer block begonnen //werden break; }
Hmmm...mehr faellt mir ma grad so net ein, hoffe aber, dass das schon mal ok
istmfg
v R
-
Ein klassischer Anfängerfehler ist auch breaks nach cases zu vergessen obwohl man sie eigentlich benötigen würde. (Der Compiler sagt dazu leider klarerweise nichts...
)
Oder bei STL-Funktionen die Präfixe entgegennehmen diese als myPrefix() statt als myPrefix zu übergeben...
-
if (x = y)
statt
if (x == y)
-
Ringincludes sind auch fies.
a.h in b.h includen und b.h in a.h includen. Passiert zwar nicht nur Anfängern, aber die wissen am wenigsten, was ihnen da passiert sein könnte.
-
for(int i=0; i<10; ++i);
Arrayindex mit 1 beginnen statt mit 0 (hinten Speicherüberschreitung)
-
Also Variablen innerhalb eines Case-Zweiges geht doch
Für das if (x = 9)-Problem würd ich einfach als Tipp schreiben,dass man sich
angewöhnen soll if (9 == x) zu schreiben
-
Hi,
virtuell Realisticer schrieb:
Hi,
was mir schon ein paar mal passiert ist:
if(....); wird_ja_nie_aufgrund_der_bedingung_ausgefuehrt();
Weiss jetzt allerdings nicht, ob der Compiler ne Meldung wirft.
gute Compiler tun das:
warning C4390: ';': Leere kontrollierte Anweisung aufgetreten; ist dies beabsichtigt?
Manchmal macht man das ja aber auch absichtlich, v.a. bei while()-Schleifen.
ChrisM
-
Hi,
mir fällt da gerade etwas ein, was zwar keinen fehler generiert, aber Anfängern mal passieren kann:
for(int i = 1;i < 10; i++); { //... }
-
c++eus schrieb:
Hi,
mir fällt da gerade etwas ein, was zwar keinen fehler generiert, aber Anfängern mal passieren kann:
for(int i;i < 10; i++); { //... }
Aber hallo, i ist nicht initialisiert.
-
Daniel E. schrieb:
c++eus schrieb:
Hi,
mir fällt da gerade etwas ein, was zwar keinen fehler generiert, aber Anfängern mal passieren kann:
for(int i;i < 10; i++); { //... }
Aber hallo, i ist nicht initialisiert.
Doch mit 0
-
Daniel E. schrieb:
c++eus schrieb:
Hi,
mir fällt da gerade etwas ein, was zwar keinen fehler generiert, aber Anfängern mal passieren kann:
for(int i;i < 10; i++); { //... }
Aber hallo, i ist nicht initialisiert.
Habs schon verbessert. Wobei: das kann man ja eigentlich auch aufführen. Gibt zwar ebenfals keinen Fehler, kommt aber zu unvorhersehbaren Fehlern.
-
SirLant schrieb:
Doch mit 0
Nur wenn die Schleife global wäre. Dann wiederum erzeugt sie einen Syntaxfehler.
c++eus: Genau das meinte ich. Viele Compiler warnen allerdings irgendwie.
-
SirLant schrieb:
Daniel E. schrieb:
c++eus schrieb:
Hi,
mir fällt da gerade etwas ein, was zwar keinen fehler generiert, aber Anfängern mal passieren kann:
for(int i;i < 10; i++); { //... }
Aber hallo, i ist nicht initialisiert.
Doch mit 0
Mit 0? Wird es nicht mit dem schon im Speicher befindlichen Wert belegt?
Bei mir kommt folgendes raus:1073823776
-
Daniel E. schrieb:
c++eus: Genau das meinte ich.
War aber eigentlich nicht als Fehler gedacht...
-
Also nur bei globalen Variablen?
Mein VC++ warnte nicht als ich folgendes testete in main:
for (int i; i < 10; i++);
-
SirLant schrieb:
Mein VC++ warnte nicht als ich folgendes testete in main:
for (int i; i < 10; i++);Stell mal die Warnungsstufe hoch, dann muß er schon warnen.
-
SirLant schrieb:
Also nur bei globalen Variablen?
Mein VC++ warnte nicht als ich folgendes testete in main:
for (int i; i < 10; i++);Lass dir doch mal i ausgeben. Dann erhälst du Zahlen wie 10543.
musicman schrieb:
Stell mal die Warnungsstufe hoch, dann muß er schon warnen.
Aber dabei handelt es sich doch um gültiges Standard-C++, oder? Da dürfte er doch keine Warnung ausgeben.
-
C++Eus schrieb:
Aber dabei handelt es sich doch um gültiges Standard-C++, oder? Da dürfte er doch keine Warnung ausgeben.
int i =1; //... if(i = 5)
Das ist auch Standard-C++, trotzdem ist der Compiler so nett und weist darauf hin, dass es vielleicht nicht so gewollt ist!
[edit]hab die Quote-Tags korrigiert[/edit]
-
Bleibt c++eus noch zu sagen, dass ich schon vor ihm auf den Semikolon-hinter-for-Schleife-Fehler gekommen bin.