Hi there. I've just written an extremely simple cross-platform wrapper for posix threads. I compiled it on unix and it compiles with no errors. The windows side... not so pretty. I'm using MinGW.
gcc compiles fine but throws a couple of warnings at me (I'll explain in a bit.) g++ gives me errors.
I'm compiling with '-Wall -ansi -g' switches.
The error that I'm getting is related to the _beginthreadex function. In my header file I've defined this:
#ifdef _WIN32
#define THREAD_PROC unsigned (*)(void*)
#else
#define THREAD_PROC void* (*)(void*)
#endif
THREAD_T InitiateDetachedThread(THREAD_PROC, void*);
And in my .c file is:
#ifdef _WIN32
THREAD_T InitiateDetachedThread(unsigned (*start)(void*), void* a) {
return (THREAD_T)_beginthreadex(NULL, 0, start, a, 0, NULL);
}
#else
THREAD_T InitiateDetachedThread(void* (*start)(void*), void* a) {
THREAD_T t;
pthread_create(&t, NULL, start, a);
pthread_detach(t);
return t;
}
#endif /*_WIN32*/
Like I said, the unix side compiles with no complaints. When i compile with gcc on MinGW I get:
$ gcc -Wall -ansi -g -c threads.c
threads.c: In function `InitiateDetachedThread':
threads.c:16: warning: passing arg 3 of `_beginthreadex' from incompatible pointer type
And g++ gives me the full-blown error:
threads.c: In function `void* InitiateDetachedThread(unsigned int (*)(void*), void*)':
threads.c:16: error: invalid conversion from `unsigned int (*)(void*)' to `unsigned int (*)(void*)'
threads.c:16: error: initializing argument 3 of `long unsigned int _beginthreadex(void*, unsigned int, unsigned int (*)(void*), void*, unsigned int, unsigned int*)'
I don't get why it won't cast... it shouldn't have to! It's like the compiler's saying "Can't cast from int to int."