C 程序编译器警告仅在 Windows (MinGW-w64)
C program compiler warning only in Windows (MinGW-w64)
我构建了一个多语言软件图像处理程序,并使其在 Mac OS X 和 Ubuntu 的二进制文件中普遍可用。二进制文件已经在各自的操作系统上进行了测试,一切正常。我最近还尝试发布 Windows(64 位)的二进制文件,但是当我创建共享库 (dll) 文件时,GCC(通过 MinGW-w64)编译器针对其中一个 C 程序发出了警告。这在 Mac OS X 或 Ubuntu 中没有发生。以下是 C 文件中的警告和相应的代码行:
warning: passing argument 3 of '_beginthreadex' from incompatible pointer type [enabled by default]
第 464 行:
ThreadList[i] = (HANDLE)_beginthreadex( NULL, 0, &ThreadFunc, &ThreadArgs[i] , 0, NULL );
第二次陌生警告:
c:\mingw\x86_64-w64-mingw32\include\process.h:31:29: note:
expected 'unsigned int <*><void *>' but argument is of type 'void * <*><void *>'
_CRTIMP uintptr_t _cdecl _beginthreadex<void *_Security,unsigned _Stacksize,unsigned <_stdcall *_StartAddress> <void *>,void *_ArgList,unsigned _InitFlag,unsigned *_ThrdAddr >;
第 34 行:
#include <process.h>
这属于这个更大的代码块:
/* Multithreading stuff*/
#ifdef _WIN32
#include <windows.h>
#include <process.h>
#else
#include <pthread.h>
#endif
#include <stdbool.h>
问题似乎出自 #include <process.h>
,因为 Mac OS X 和 Ubuntu 使用了 #include <pthread.h>
。有什么帮助解决这个问题吗?完整的 C 程序是 here 。
为 windows 而不是为其他系统编译时的消息不足为奇。由于 _WIN32
宏的使用仅在为 windows.[= 构建代码时由编译器定义,因此只有在为 windows 构建时编译器才会看到有问题的代码。 19=]
"second and stranger warning"描述的是原因。 (windows 特定)_beginthreadex()
函数的第三个参数指定为指向 return 是 unsigned int
的函数的指针。实际传递的 ThreadFunc
是一个 return 是 void *
的函数。
使代码为 windows 编译器所接受的解决方法是将 ThreadFunc()
的 return 类型更改为 return unsigned int
。这将破坏其他系统的代码,因此您需要有条件地进行更改(即有两个版本的函数,select 通过测试 _WIN32
宏来选择正确的版本)。
#ifdef _WIN32
/* use the windows version of the function here */
#else
/* use the non-windows version of the function here */
#endif
我构建了一个多语言软件图像处理程序,并使其在 Mac OS X 和 Ubuntu 的二进制文件中普遍可用。二进制文件已经在各自的操作系统上进行了测试,一切正常。我最近还尝试发布 Windows(64 位)的二进制文件,但是当我创建共享库 (dll) 文件时,GCC(通过 MinGW-w64)编译器针对其中一个 C 程序发出了警告。这在 Mac OS X 或 Ubuntu 中没有发生。以下是 C 文件中的警告和相应的代码行:
warning: passing argument 3 of '_beginthreadex' from incompatible pointer type [enabled by default]
第 464 行:
ThreadList[i] = (HANDLE)_beginthreadex( NULL, 0, &ThreadFunc, &ThreadArgs[i] , 0, NULL );
第二次陌生警告:
c:\mingw\x86_64-w64-mingw32\include\process.h:31:29: note:
expected 'unsigned int <*><void *>' but argument is of type 'void * <*><void *>'
_CRTIMP uintptr_t _cdecl _beginthreadex<void *_Security,unsigned _Stacksize,unsigned <_stdcall *_StartAddress> <void *>,void *_ArgList,unsigned _InitFlag,unsigned *_ThrdAddr >;
第 34 行:
#include <process.h>
这属于这个更大的代码块:
/* Multithreading stuff*/
#ifdef _WIN32
#include <windows.h>
#include <process.h>
#else
#include <pthread.h>
#endif
#include <stdbool.h>
问题似乎出自 #include <process.h>
,因为 Mac OS X 和 Ubuntu 使用了 #include <pthread.h>
。有什么帮助解决这个问题吗?完整的 C 程序是 here 。
为 windows 而不是为其他系统编译时的消息不足为奇。由于 _WIN32
宏的使用仅在为 windows.[= 构建代码时由编译器定义,因此只有在为 windows 构建时编译器才会看到有问题的代码。 19=]
"second and stranger warning"描述的是原因。 (windows 特定)_beginthreadex()
函数的第三个参数指定为指向 return 是 unsigned int
的函数的指针。实际传递的 ThreadFunc
是一个 return 是 void *
的函数。
使代码为 windows 编译器所接受的解决方法是将 ThreadFunc()
的 return 类型更改为 return unsigned int
。这将破坏其他系统的代码,因此您需要有条件地进行更改(即有两个版本的函数,select 通过测试 _WIN32
宏来选择正确的版本)。
#ifdef _WIN32
/* use the windows version of the function here */
#else
/* use the non-windows version of the function here */
#endif