Unter der Kategorie Kuriositäten kann man glaube folgenden GCC-Bug abhandeln, der bei mir mit folgendem Source auftrat:
// Run the job we've taken
if(cleanup_func) {
pthread_cleanup_push(cleanup_func, cleanup_arg);
}
job_func(job_arg);
if(cleanup_func) {
pthread_cleanup_pop(1);
}
Wobei job_func ein normaler Callback-Typ der Form
typedef void (* dispatch_func_t)(void *);
ist, also einen Pointer entgegen nimmt und nix zurückliefert. Nunja. Versucht man obigen Source (im Zusammenhang mit etwas mehr Source eines Thread-Pools zu compilieren, erhält man recht überraschend eine Fehlermeldung vom GCC (4.6.1-4):
gcc -g -Wall -Werror -std=c99 -I./src -O9 -o ./obj/threadpool.o -c ./src/threadpool.c ./src/threadpool.c: In Funktion »_threadpool_dowork«: ./src/threadpool.c:120:9: Fehler: expected »while« before »job_func«
Und ja: Der will da wirklich ne While-Schleife haben! Geben wir sie ihm also:
// Run the job we've taken
if(cleanup_func) {
pthread_cleanup_push(cleanup_func, cleanup_arg);
}
//GCC fails if I DON'T write a while loop here. Let's make it happy!
while(0);
job_func(job_arg);
if(cleanup_func) {
pthread_cleanup_pop(1);
}
Und der GCC ist zufrieden.