Gå til innhold

Anbefalte innlegg

Videoannonse
Annonse

Ja, den er klassisk. Men en god kompilator gir deg en warning (MSVC 7.1 gir warning). En enda mer klassisk feil er kanskje:

 

if(end_pos = 0)
  end_pos = my_pos;

 

Derfor pleier jeg alltid skrive konstanten først:

if(0 == end_pos)
   end_pos = my_pos

 

:)

Lenke til kommentar

Han skjønte nok det, <BøNilzen> :)

 

Men det er heldigvis lett for kompilatorer å rette en if (var = 5), det er "fortere gjort" å glemme å definere en copy-ctor for klasser med dynamisk allokert minne e.l. (Har brent meg på det et par ganger opp gjennom tida..)

Lenke til kommentar
Han skjønte nok det, <BøNilzen> :)

 

Men det er heldigvis lett for kompilatorer å rette en if (var = 5), det er "fortere gjort" å glemme å definere en copy-ctor for klasser med dynamisk allokert minne e.l. (Har brent meg på det et par ganger opp gjennom tida..)

Hmmm... ikke mange kompilatorer (ingen?) gir deg warning ved å skrive:

if(var = 5)
{
  //...
}

 

Verken msvc eller gcc gir deg noen som helst warning, fordi det jo er helt legal og meningsfylt kode.

 

Men:

if(5 = var)
{
  //...
}

... kompilerer derimot ikke. Kan ikke telle hvor mange ganger jeg har rettet opp andres kode som har denne "unødvendige" feilen. Noen takler ikke å ha konstanten først, men fakta er at mange gjør denne feilen. Den kunne vært unngått hvis man tilvenner seg å skrive konstanten først.

 

Mangelen på copy c'tor er også en stor feilkilde som du nevner. Og ikke minst mangelen på en virtuell copy c'tor (Clone) et sted nede i klassehiarkiet...

Endret av kjetil7
Lenke til kommentar

Husk at kompilere har forskjellige nivåer for advarsler. F.eks. GCC's C-kompiler 'gcc' og GCC's C++-kompiler 'g++' har begge en parameter -Wall som er kjekk.

 

Denne koden:

int i;
if(i = 5) {}

 

Gir ingen meldinger når jeg kompilerer slik:

gcc test.c -o test

..eller slik..

g++ test.cpp -o test

 

Derimot, hvis jeg øker "advarsel-nivået":

gcc -Wall test.c -o test

test.c: In function `main':

test.c:5: warning: suggest parentheses around assignment used as truth value

..eller slik..

g++ -Wall test.cpp -o test

test.cpp: In function `int main()':

test.cpp:5: warning: suggest parentheses around assignment used as truth value

 

Kan være lurt å ha -Wall (og andre parametere) på mens man driver med kodingen. :]

 

Dette gjelder GCC 3.* og MinGW (basert på GCC 3.*).

 

Edit:

	int i;
if(i == 1) 
 i == 2;

 

g++ -Wall test.cpp -o test

test.cpp: In function `int main()':

test.cpp:6: warning: statement with no effect

 

...hm.. tror jeg må sjekke Makefilene .. jeg skulle fått advarsel, for jeg vet at tidligere så har (blandt annet) -Wall vært med, så noe må ha gått i vasken her et sted på veien .. :}

Endret av søppel
Lenke til kommentar

Selvfølgelig kan du sette opp advarselnivået. Men da får du sannsynligvis mange andre uønskede advarsler også. Jeg vil våge å påstå at de fleste ikke bruker høyeste advarselnivå på kompilatoren sin.

 

Alle mine tester var med standard advarselnivå (noe som jeg selvfølgelig burde ha nevnt).

 

Poenget mitt var bare at det er en god kodeskikk å skrive konstanten først i slike tilfeller. Selvfølgelig er opp til en selv om man ønsker å praktisere det, men jeg kan i hvertfall av erfaring si at MANGE gjør denne feilen.

 

Edit: skriveleifer

Endret av kjetil7
Lenke til kommentar

Jeg har også inntrykk av at -Wall er mye brukt, bruker det også ofte selv. Jeg vet at på flere akademiske institutter (les: Universiteter rundt omkring osv.) er det et krav at programmene skal kompilere med -Wall uten å klage.

 

Testet på Borlands gratis kommandolinje-kompilator, og den sa:

Warning W8060 tmp1.cpp 4: Possibly incorrect assignment in function main()

Lenke til kommentar

Mulig det. Snakker bare av egen erfaring jeg. I de produksjonsmiljøene jeg har kjennskap til er det mest vanlig med lev. 3 i msvc og standard nivå på Sun kompilatoren. Har aldri brukt gcc i kommersiell sammenheng så jeg har ikke like god kjennskap til den.

 

Men kompilatorene blir jo bedre og bedre og de bør jo kanskje gi en warning når det ikke står i parantes etter min mening.

 

Uansett var det i hvertfall noe av det første jeg ble lært av gode kodeskikker i sin tid tilbake (for mange, mange år siden ;) )

 

Skal forøvrig teste på Intel kompilatoren når jeg får tid. Har den ikke på maskinen her, men skal se hva jeg får til i morgen (hvis ingen er raskere enn meg..)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...