在使用mingw-w64 i686-7.1.0-posix-sjlj-rt_v5-rev0版编译SDL2 test程序的过程中,遇到如下错误
testatomic.c:106:1: note: in expansion of macro 'SDL_COMPILE_TIME_ASSERT' SDL_COMPILE_TIME_ASSERT(size, CountTo>0); /* check for rollover */
换编译器mingw32单独编译该文件,却没有错误。
查看testatomic.c文件中的代码出错的位置
#define NThreads 2 #define CountInc 100 #define VALBITS (sizeof(atomicValue)*8) #define atomicValue int #define CountTo ((atomicValue)((unsigned int)(1<<(VALBITS-1))-1)) #define NInter (CountTo/CountInc/NThreads) #define Expect (CountTo-NInter*CountInc*NThreads) SDL_COMPILE_TIME_ASSERT(size, CountTo>0); /* check for rollover */
SDL_COMPILE_TIME_ASSERT应该是想测试把1左移31位后,是否发生溢出。输出CountTo的值为2147483647,按理应该能通过测试的。但不知是不是预处理器中有bug,实际该检测不能通过。对代码作如下修改,指明1为无符号类型,编译通过。
#define CountTo ((atomicValue)((unsigned int)(1u<<(VALBITS-1))-1))