64位编译时pthread.h报expected identifier or '(' before '{' token错误
解决MinGW64编译pthread代码时pthread.h的宏定义错误
看起来你踩了MinGW64下用严格C标准编译pthread代码的坑,我来帮你一步步解决:
核心问题原因
你遇到的expected identifier or '(' before '{' token错误,根源是pthread.h里的那些递归API模拟宏用了GNU C特有的语句表达式({ ... })——这种语法不是C99标准的一部分,而你编译时指定了-std=c99,这个参数会让编译器进入严格的C标准模式,禁用所有GNU扩展,所以编译器认不出这种语法。
解决方案步骤
修改编译标准选项
把编译参数里的-std=c99替换成-std=gnu99。这个选项会启用C99标准的同时,保留GNU扩展支持,刚好适配pthread.h里的宏语法。
在CodeBlocks里的操作:- 右键项目 →
Build Options - 切换到
Compiler Settings→Other Options - 把原来的
-std=c99改成-std=gnu99
- 右键项目 →
处理
sleep函数的警告
Windows平台没有标准C的sleep()函数,你看到的警告是因为编译器找不到这个函数。解决方法有两种:- 方法一:改用Windows原生的
_sleep()函数
在代码开头包含<windows.h>,然后把sleep(1)改成_sleep(1000)(注意_sleep的参数是毫秒,1000毫秒=1秒)。 - 方法二:用pthread的跨平台延迟函数
把sleep(1)替换成pthread_delay_np(NULL, (const struct timespec[]){{1, 0}});,这个是pthread库提供的跨平台延迟接口,不需要额外头文件。
- 方法一:改用Windows原生的
修改后的完整代码示例
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <windows.h> // 用于_sleep函数 void *myThreadFun(void *vargp) { _sleep(1000); // 替换成Windows的延迟函数 printf("Printing GeeksQuiz from Thread \n"); return NULL; } int main() { pthread_t tid; printf("Before Thread\n"); pthread_create(&tid, NULL, myThreadFun, NULL); pthread_join(tid, NULL); printf("After Thread\n"); exit(0); }
验证修改后的编译命令
修改后你的编译命令应该变成:
x86_64-w64-mingw32-gcc.exe -Wall -g -std=gnu99 -m64 -I"C:\Program Files (x86)\CodeBlocks\MinGW" -c Z:\CTemp\CProjects\MultiThreadGCCx64\main.c -o obj\Debug\main.o
这样编译应该就能通过,并且正常运行了。
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

