enum { SUCCEED = 0, ERROR }; typedef unsigned long xnumber; typedef char xchar; typedef struct { xchar * text; xnumber len; } xstring; int xFindS(xstring * buf, xstring * needle, xnumber * pos) { xnumber tpos = *pos; for(xnumber n = 0; tpos < buf->len; tpos++) { if(buf->text[tpos] == *needle->text) { for(; n < needle->len; n++) { if(buf->text[tpos+n] != needle->text[n]) break; if(n == needle->len-1) { *pos = tpos; return SUCCEED; } } tpos = n+1; } } return ERROR; } int main() { return 0; }
1>------ Build started: Project: cml, Configuration: Debug Win32 ------
1>Compiling...
1>main.cpp
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(20) : error C2143: syntax error : missing ';' before 'type'
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(20) : error C2143: syntax error : missing ';' before 'type'
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(20) : error C2143: syntax error : missing ')' before 'type'
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(20) : error C2143: syntax error : missing ';' before 'type'
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(20) : warning C4552: '<' : operator has no effect; expected operator with side-effect
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(20) : error C2059: syntax error : ')'
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(21) : error C2143: syntax error : missing ';' before '{'
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(24) : error C2065: 'n' : undeclared identifier
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(24) : warning C4018: '<' : signed/unsigned mismatch
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(24) : error C2065: 'n' : undeclared identifier
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(26) : error C2065: 'n' : undeclared identifier
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(26) : error C2065: 'n' : undeclared identifier
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(29) : error C2065: 'n' : undeclared identifier
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(36) : error C2065: 'n' : undeclared identifier
1>Build log was saved at "file://c:\Users\Wille\Documents\Visual Studio 2008\Projects\cml\cml\Debug\BuildLog.htm"
1>cml - 12 error(s), 2 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Miksi yllä oleva koodi kääntyy c++:na, mutta ei c:nä? Miten tuo korjataan?
Olen ohjelmoinut nyt monta vuotta c++:lla, mutta kun vähääkään sörkkii ceetä niin mikään ei toimi.
Luultavasti kääntäjäsi ei tue C99-standardia. (Useimmat eivät jostain syystä sitä käytäkään.) Vanhemmassa C:ssä ei saa esimerkiksi määritellä muuttujia kesken koodin, vaan kaikki määrittelyt pitää laittaa funktion alkuun. Varsinainen virhe tulee siis kohdasta xnumber n
, loput taitavat johtua tästä.
Se on uusin MS:n kääntäjä..
Jööh, tosiaan siitähän ne virheet tulikin.
Luultavasti C99-tila pitäisi erikseen laittaa päälle; useimmat kääntäjät käyttävät oletuksena vanhempaa standardia (C89/C90). Toisaalta C99:n käytöstä saa kummasti vielä näin kymmenen vuotta myöhemminkin sontaa niskaansa ("miksi käytät tuollaista, mikset koodaa oikealla C:llä, n00b"), joten kannattaa pitää varansa, jos aikoo julkaista koodia. ;) Sinänsä tuollaiset paikallisesti (esim. juuri yhtä silmukkaa varten) määritellyt muuttujat ovat hyvä asia koodin luettavuuden, optimoinnin ja virheiden ehkäisyn kannalta, ja itse pidän kovasti mm. näistä C99:n syntaksillisista parannuksista (erityisesti ensimmäisestä):
struct S { int a, b, c; }; struct S koe = { .a = 10, // .b = 0, // tulee itsestään, kun muita asetetaan mutta tätä ei .c = 12 }; int t[10] = {[0] = 0, [4] = 4, 5, 6};
Aihe on jo aika vanha, joten et voi enää vastata siihen.