为什么我得到“从指针到不同大小的整数”错误?
发布时间:2020-12-16 05:35:11 所属栏目:百科 来源:网络整理
导读:以下行(纯c)在 Windows(win7 64位代码块13 mingw32)和debian(wheezy 32位代码块10 gcc)上干净地编译,但会引发对kali(64位代码块gcc)的警告.任何意见?我的意思是,为什么我得到这个警告,虽然同一行编译w / o任何警告在Windows debian的? void* foo(void *dst
以下行(纯c)在
Windows(win7 64位代码块13 mingw32)和debian(wheezy 32位代码块10 gcc)上干净地编译,但会引发对kali(64位代码块gcc)的警告.任何意见?我的意思是,为什么我得到这个警告,虽然同一行编译w / o任何警告在Windows& debian的?
void* foo(void *dst,...) { // some code unsigned int blkLen = sizeof(int); // this line ok. unsigned int offset = (unsigned int) dst % blkLen; // warning here! // some code cont... } 代码块中的消息是:“error:从指针转换为不同大小的整数[-Werror = pointer-to-int-cast]” 注意:我的编译器选项是-std = c99 -Werror -save-temps(在所有三个系统上相同). 编辑2: 编辑1: #if __linux__ // or #if __GNUC__ #if __x86_64__ || __ppc64__ #define ENVIRONMENT64 #else #define ENVIRONMENT32 #endif #else #if _WIN32 #define ENVIRONMENT32 #else #define ENVIRONMENT64 #endif #endif // __linux__ #ifdef ENVIRONMENT64 #define MAX_BLOCK_SIZE unsigned long long int #else #define MAX_BLOCK_SIZE unsigned long int #endif // ENVIRONMENT64 然后将问题行替换为: unsigned int offset = (MAX_BLOCK_SIZE) dst % blkLen; 现在,一切似乎都可以. 解决方法
警告的原因是编译器怀疑你可能试图通过int和back来往返指针.这是在64位机器出现之前的常见做法,它不安全或不合理.当然这里编译器可以清楚地看到你没有这样做,如果这样做足够聪明,以避免在这种情况下的警告,那将是很好的,但不是这样.
一个干净的选择,避免警告,而转换的值为负的另一个更糟糕的错误结果的问题是: unsigned int offset = (uintptr_t) dst % blkLen; 您需要包含stdint.h或inttypes.h才能使用uintptr_t. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |