为什么我得到“从指针到不同大小的整数”错误?

以下行(纯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:
虽然我已经设法使用下面的预处理器行编译w / o警告,
@Keith Thompson(见下文)对这个问题至关重要.所以,我最后的决定是使用uintptr_t将是一个更好的选择.

编辑1:
感谢大家回复.正如所有的回复记录,问题是32位与64位的问题.我插入以下预处理行:

#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.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...