Det var ett par år sedan jag körde C riktigt ordentligt och för några dagar sedan blev jag lite sugen när jag skrev ett litet multitrådat c program för att testa hur snabbt man kan göra vissa beräkningar på en multicore maskin.

C är ju ett mycket enkelt språk och faktiskt rätt lätt att lära sig eftersom det inte finns så mycket man kan göra i själva språket. Men efter många år av programmerande i den objektorienterade världen vill man ju gärna inte sluta programera objektorienterat, då det är ett bra sätt att bygga sina program eftersom det mappar rätt bra mot verkligheten. Att programmera objektorienterat i C går bra faktiskt även om det inte finns stöd för det i själva språket. Exempel på objektorienterad C kan man se i GTK+ och GNOME. Att däremot skapa egna klasser och hantera arv och dyligt i objektorienterad C är ett rent h***te.

Mitt val blir istället en kompromiss där jag kör med structar som representerar klassen på ett objekt och sedan metoder som manipulerar detta objekt. Alla metoder tar in en pekare till objektet som första parameter precis som medlems metoder i Python. Koden blir helt ok och det går att skriva väldigt tydlig och läsbar kod.

Som van objektorienterad programerare så börjar jag med att skapa min ”klass” och dess metoder. Allt flyter på fint och jag skapar konstruktorer och destruktorer. Men eftersom det är en applikation som skall jobba som en server blir det ju väldigt mycket saker som kan gå fel rent IO mässigt och då måste man ju kunna returnera fel till de anropande metoderna.

Här börjar problemen. Man kan ju välja olika felrapporterings tekniker som tex returnera en status kod eller skicka med en pekare till en fel struktur. Hur som helst så är detta relativt problemfritt att lösa i själva metoden men det är koden som tar emot felen som blir helt kalasdålig. Jag vet ju att detta har varit problem förut men jag har helt förträngt hur oändligt dåligt det är med felhanteringen i C. Det går ju inte heller att kompromissa bort felhanteringen och eftersom det är ett språk baserat på pekare till minnesareor så är det ju desto viktigare att man har ordentlig felhantering.

Jag läste på något forum att c1x (nästa c standard) kanske skall innehålla nån ny felhanteringsteknik liknande try catch som finns i så många andra språk. Av mina erfarenheter med C så tycker jag att om de bara kan fixa en enda sak så borde det vara ordentlig felhantering. Jag kommer nog inte att fortsätta att bygga min applikation i C på grund av att jag min högsta prio är ren, tydlig och vacker kod och det kan jag inte få om det är en klase felhantering under varje metodanrop. Det kanske är dags att testa nästa språk i alfabetet D. ;-)

Här är budord nr 6 av ”The Ten Commandments for C Programmers”:
”If a function be advertised to return an error code in the event of difficulties, thou shalt check for that code, yea, even though the checks triple the size of thy code and produce aches in thy typing fingers, for if thou thinkest ”it cannot happen to me”, the gods shall surely punish thee for thy arrogance.”