gpt4 book ai didi

c - 为什么会出现 "cast from pointer to integer of different size"错误?

转载 作者:太空狗 更新时间:2023-10-29 16:39:29 24 4
gpt4 key购买 nike

以下行(纯 c)在 windows(win7 64 位 + codeblocks 13 + mingw32)和 debian(wheezy 32 位 + codeblocks 10 + gcc)上编译干净但会在 kali(64 位 + 代码块 + gcc)上发出警告。任何意见?我的意思是,为什么我会收到此警告,尽管同一行在 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...
}

代码块中的消息是:“错误:从指针转换为不同大小的整数 [-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 来回往返指针。这是 64 位机器出现之前的常见做法,既不安全也不合理。当然,编译器在这里可以清楚地看到您没有这样做,如果它足够聪明,可以在这种情况下避免警告,那就太好了,但事实并非如此。

一个干净的替代方案可以避免警告,并且当转换值为负数时另一个更严重的错误结果问题是:

unsigned int offset = (uintptr_t) dst % blkLen;

您需要包含 stdint.hinttypes.h 才能使 uintptr_t 可用。

关于c - 为什么会出现 "cast from pointer to integer of different size"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26805461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com