在 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 *
来说是正确的类型。