You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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扩展,所以编译器认不出这种语法。

解决方案步骤

  1. 修改编译标准选项
    把编译参数里的-std=c99替换成-std=gnu99。这个选项会启用C99标准的同时,保留GNU扩展支持,刚好适配pthread.h里的宏语法。
    在CodeBlocks里的操作:

    • 右键项目 → Build Options
    • 切换到Compiler Settings → Other Options
    • 把原来的-std=c99改成-std=gnu99
  2. 处理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库提供的跨平台延迟接口,不需要额外头文件。

修改后的完整代码示例

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:53:54