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.