【发布时间】:2015-01-04 11:50:59
【问题描述】:
以下行(纯 c)在 windows(win7 64 位 + 代码块 13 + mingw32)和 debian(wheezy 32 位 + 代码块 10 + gcc)上干净地编译但会在 kali(64 位 + 代码块 + gcc)上发出警告。有cmets吗?我的意思是,为什么我会收到这个警告,尽管在 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: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]”
注意:我的编译器选项是-std=c99 -Werror -save-temps(在所有三个系统上都相同)。
编辑 2:
虽然我已经设法使用下面的预处理器行编译它而没有警告,
@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 的大小与指针的大小不同。但是,对于典型系统,偏移量的值将是 0...3。因此,将模的结果转换为 unsigned int 可以解决问题。