在 Visual Studio C++ 版本 9(可能还有其他版本)中,以下代码:
int a = sizeof(void);
void const *b = static_cast<void const *>("hello world");
b += 6;
生成these http://msdn.microsoft.com/en-us/library/9adz64y0.aspx errors http://msdn.microsoft.com/en-us/library/1kay26wa%28VS.80%29.aspx:
error C2070: 'void': illegal sizeof operand
error C2036: 'const void *' : unknown size
该代码在 GCC 下运行,它处理sizeof(void) as 1 http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith.
是否有某种方法可以解决此限制,例如显式转换为char *
出于指针算术的目的增加了混乱(void *
被广泛认可并用作指向原始内存的无类型指针)。
Update0
- 请注意,我很清楚
标准的存在。
- I want做原始指针
算术。
- I take
sizeof(void)
到
表明我很清楚这个事实
事实并非如此1
是个
问题的原因。
- 代码
例子只是为了证明什么
需要生成错误。
- 我知道这不是“正常”的使用方式
void
,但这是 C,这些事情就会发生。
- 是的,人们需要在低水平上做到这一点。我不追求为什么,我追求如何。如果你想知道为什么,请查看一些内核源代码,或者你友好的 glibc。
Update1
看来这个问题引起了很大的混乱。问题不在于why having sizeof(void) == 1
不是标准的,但是当不标准时该怎么办。
在要完成单字节指针算术的实例中,事实证明,强制转换为char *
是正确答案,不是因为*(void *)
没有尺寸,但因为标准实际上保证了*(char *)
总是1
。因此使用char *
总是正确的,并且与void *
与 GCC 扩展一起用于原始指针算术。
为了进一步强调这一点,void *
是指向无类型内存的指针的正确选择,并且char *
是正确的类型用于原始指针算术.
从技术上讲,增加指针应该是增加它所指向的对象的大小。虚空指的是虚无,所以大小未知。
对于某些编译器来说,让您增加 void 指针是一件好事。
强制转换很烦人,因为您必须将其强制转换为另一个指针,然后再返回,或者做一些尴尬的事情,例如(*(char *)&voidptr) += 6
就我个人而言,我只是将其声明为char *
出于算术目的
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)