"error: expected identifier or '(' before '{' token" on pthread.h when compiling for 64-bits
"error: expected identifier or '(' before '{' token" on pthread.h when compiling for 64-bits
我发现了以前关于此错误消息的问题,但它们与我的情况不符,情况是这样的:
环境:Windows 8.1 和配置了 64 位 GCC 的代码块 => How do I compile for 64bit using G++ w/ CodeBlocks?
问题:测试基本的多线程,=> https://www.geeksforgeeks.org/multithreading-c-2/中列出的简单程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
// A normal C function that is executed as a thread
// when its name is specified in pthread_create()
void *myThreadFun(void *vargp)
{
sleep(1);
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);
}
在标准 32 位中编译它可以完成并完美运行,但是当使用 MinGW-64 (How do I compile for 64bit using G++ w/ CodeBlocks?) 编译时它失败并在 [=43 上出现 4 个错误=]:
pthread.h|418|error: expected identifier or '(' before '{' token|
pthread.h|428|error: expected identifier or '(' before '{' token|
pthread.h|438|error: expected identifier or '(' before '{' token|
pthread.h|447|error: expected identifier or '(' before '{' token|
不用说 pthread.h 没有以任何方式被修改或改变。错误指向四个 #define 行:
/* Recursive API emulation. */
#undef localtime_r
#define localtime_r(_Time, _Tm) ({ struct tm *___tmp_tm; \
pthread_testcancel(); \
___tmp_tm = localtime((_Time));\
if (___tmp_tm) { \
*(_Tm) = *___tmp_tm; \
___tmp_tm = (_Tm); \
} \
___tmp_tm; })
#undef gmtime_r
#define gmtime_r(_Time,_Tm) ({ struct tm *___tmp_tm; \
pthread_testcancel(); \
___tmp_tm = gmtime((_Time)); \
if (___tmp_tm) { \
*(_Tm) = *___tmp_tm; \
___tmp_tm = (_Tm); \
} \
___tmp_tm; })
#undef ctime_r
#define ctime_r(_Time,_Str) ({ char *___tmp_tm; \
pthread_testcancel(); \
___tmp_tm = ctime((_Time)); \
if (___tmp_tm) \
___tmp_tm = \
strcpy((_Str),___tmp_tm); \
___tmp_tm; })
#undef asctime_r
#define asctime_r(_Tm, _Buf) ({ char *___tmp_tm; \
pthread_testcancel(); \
___tmp_tm = asctime((_Tm)); \
if (___tmp_tm) \
___tmp_tm = \
strcpy((_Buf),___tmp_tm);\
___tmp_tm; })
其他程序编译和 运行 64 位正确,在 运行ning 时显示在进程的详细信息中。
我不明白同一个未修改的头文件如何仅在针对 64 位进行编译时才显示错误。构建日志显示:
-------------- Build: Debug in MultiThreadGCCx64 (compiler: GNU GCC Compiler x64)---------------
x86_64-w64-mingw32-gcc.exe -Wall -g -std=c99 -m64 -I"C:\Program Files (x86)\CodeBlocks\MinGW" -c Z:\CTemp\CProjects\MultiThreadGCCx64\main.c -o obj\Debug\main.o
In file included from Z:\CTemp\CProjects\MultiThreadGCCx64\main.c:11:0:
Z:\CTemp\CProjects\MultiThreadGCCx64\pthread.h:418:34: error: expected identifier or '(' before '{' token
#define localtime_r(_Time, _Tm) ({ struct tm *___tmp_tm; \
^
Z:\CTemp\CProjects\MultiThreadGCCx64\pthread.h:428:30: error: expected identifier or '(' before '{' token
#define gmtime_r(_Time,_Tm) ({ struct tm *___tmp_tm; \
^
Z:\CTemp\CProjects\MultiThreadGCCx64\pthread.h:438:30: error: expected identifier or '(' before '{' token
#define ctime_r(_Time,_Str) ({ char *___tmp_tm; \
^
Z:\CTemp\CProjects\MultiThreadGCCx64\pthread.h:447:31: error: expected identifier or '(' before '{' token
#define asctime_r(_Tm, _Buf) ({ char *___tmp_tm; \
^
Z:\CTemp\CProjects\MultiThreadGCCx64\main.c: In function 'myThreadFun':
Z:\CTemp\CProjects\MultiThreadGCCx64\main.c:19:5: warning: implicit declaration of function 'sleep'; did you mean '_sleep'? [-Wimplicit-function-declaration]
sleep(1);
^~~~~
_sleep
Process terminated with status 1 (0 minute(s), 0 second(s))
4 error(s), 1 warning(s) (0 minute(s), 0 second(s))
我承认我只是这些领域(多线程、64 位程序)的初学者,所以很抱歉,如果我问的问题对专家来说非常明显,但经过相当长的时间研究后我找不到在以前的帖子中有任何帮助,我被卡住了。
非常感谢您提供的任何帮助。
使用 64 位 MinGW 的 pthread.h
而不是复制或以其他方式使用 32 位 MinGW () 的 pthread.h
。
像这样的低级头文件是特定于编译器的,包括编译器版本和配置。
我发现了以前关于此错误消息的问题,但它们与我的情况不符,情况是这样的:
环境:Windows 8.1 和配置了 64 位 GCC 的代码块 => How do I compile for 64bit using G++ w/ CodeBlocks?
问题:测试基本的多线程,=> https://www.geeksforgeeks.org/multithreading-c-2/中列出的简单程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
// A normal C function that is executed as a thread
// when its name is specified in pthread_create()
void *myThreadFun(void *vargp)
{
sleep(1);
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);
}
在标准 32 位中编译它可以完成并完美运行,但是当使用 MinGW-64 (How do I compile for 64bit using G++ w/ CodeBlocks?) 编译时它失败并在 [=43 上出现 4 个错误=]:
pthread.h|418|error: expected identifier or '(' before '{' token|
pthread.h|428|error: expected identifier or '(' before '{' token|
pthread.h|438|error: expected identifier or '(' before '{' token|
pthread.h|447|error: expected identifier or '(' before '{' token|
不用说 pthread.h 没有以任何方式被修改或改变。错误指向四个 #define 行:
/* Recursive API emulation. */
#undef localtime_r
#define localtime_r(_Time, _Tm) ({ struct tm *___tmp_tm; \
pthread_testcancel(); \
___tmp_tm = localtime((_Time));\
if (___tmp_tm) { \
*(_Tm) = *___tmp_tm; \
___tmp_tm = (_Tm); \
} \
___tmp_tm; })
#undef gmtime_r
#define gmtime_r(_Time,_Tm) ({ struct tm *___tmp_tm; \
pthread_testcancel(); \
___tmp_tm = gmtime((_Time)); \
if (___tmp_tm) { \
*(_Tm) = *___tmp_tm; \
___tmp_tm = (_Tm); \
} \
___tmp_tm; })
#undef ctime_r
#define ctime_r(_Time,_Str) ({ char *___tmp_tm; \
pthread_testcancel(); \
___tmp_tm = ctime((_Time)); \
if (___tmp_tm) \
___tmp_tm = \
strcpy((_Str),___tmp_tm); \
___tmp_tm; })
#undef asctime_r
#define asctime_r(_Tm, _Buf) ({ char *___tmp_tm; \
pthread_testcancel(); \
___tmp_tm = asctime((_Tm)); \
if (___tmp_tm) \
___tmp_tm = \
strcpy((_Buf),___tmp_tm);\
___tmp_tm; })
其他程序编译和 运行 64 位正确,在 运行ning 时显示在进程的详细信息中。 我不明白同一个未修改的头文件如何仅在针对 64 位进行编译时才显示错误。构建日志显示:
-------------- Build: Debug in MultiThreadGCCx64 (compiler: GNU GCC Compiler x64)---------------
x86_64-w64-mingw32-gcc.exe -Wall -g -std=c99 -m64 -I"C:\Program Files (x86)\CodeBlocks\MinGW" -c Z:\CTemp\CProjects\MultiThreadGCCx64\main.c -o obj\Debug\main.o
In file included from Z:\CTemp\CProjects\MultiThreadGCCx64\main.c:11:0:
Z:\CTemp\CProjects\MultiThreadGCCx64\pthread.h:418:34: error: expected identifier or '(' before '{' token
#define localtime_r(_Time, _Tm) ({ struct tm *___tmp_tm; \
^
Z:\CTemp\CProjects\MultiThreadGCCx64\pthread.h:428:30: error: expected identifier or '(' before '{' token
#define gmtime_r(_Time,_Tm) ({ struct tm *___tmp_tm; \
^
Z:\CTemp\CProjects\MultiThreadGCCx64\pthread.h:438:30: error: expected identifier or '(' before '{' token
#define ctime_r(_Time,_Str) ({ char *___tmp_tm; \
^
Z:\CTemp\CProjects\MultiThreadGCCx64\pthread.h:447:31: error: expected identifier or '(' before '{' token
#define asctime_r(_Tm, _Buf) ({ char *___tmp_tm; \
^
Z:\CTemp\CProjects\MultiThreadGCCx64\main.c: In function 'myThreadFun':
Z:\CTemp\CProjects\MultiThreadGCCx64\main.c:19:5: warning: implicit declaration of function 'sleep'; did you mean '_sleep'? [-Wimplicit-function-declaration]
sleep(1);
^~~~~
_sleep
Process terminated with status 1 (0 minute(s), 0 second(s))
4 error(s), 1 warning(s) (0 minute(s), 0 second(s))
我承认我只是这些领域(多线程、64 位程序)的初学者,所以很抱歉,如果我问的问题对专家来说非常明显,但经过相当长的时间研究后我找不到在以前的帖子中有任何帮助,我被卡住了。
非常感谢您提供的任何帮助。
使用 64 位 MinGW 的 pthread.h
而不是复制或以其他方式使用 32 位 MinGW (pthread.h
。
像这样的低级头文件是特定于编译器的,包括编译器版本和配置。