在 Visual Studio C++ 版本 9(可能还有其他版本)中,以下代码:
int a = sizeof(void);
void const *b = static_cast<void const *>("hello world");
b += 6;
error C2070: 'void': illegal sizeof operand
error C2036: 'const void *' : unknown size
此代码在 GCC 下工作,GCC 将其sizeof(void)视为1.
有没有办法绕过这个限制,因为char *为了指针算术的目的而显式地强制转换会增加混乱(void *被很好地识别并用作指向原始内存的无类型指针)。
更新0
- 请注意,我很清楚该标准的存在。
- 我想做原始指针算术。
- 我要
sizeof(void)表明我很清楚这不是1问题的原因。 - 该代码示例只是为了演示生成错误所需的内容。
- 我知道这不是一种“正常”的使用方式
void,但这是 C,并且会发生这些事情。 - 是的,人们需要在底层做这件事。我不是在追求为什么,我在追求如何。如果你想知道为什么,看看一些内核源代码,或者你友好的 glibc。
更新1
这个问题似乎引起了很大的混乱。问题不在于为什么拥有sizeof(void) == 1不标准,而在于如果不是标准该怎么办。
在要进行单字节指针运算的情况下,事实证明强制转换为char *是正确的答案,不是因为*(void *)没有大小,而是因为标准实际上保证*(char *)是 always 1。因此,对于原始指针算术的目的,使用char *总是正确的,并且与 GCC 扩展一致。void *
为了进一步强调这一点,void *对于指向无类型内存的指针是正确的选择,并且对于原始指针算术char *来说是正确的类型。