我获得了一个与gcc无关的MSVC项目。特别是这个错误很有意思:
void * str;
str = "data"; // error
str = (char*)"data"; // working
错误是:Error: invalid conversion from ‘const void*’ to ‘void*’
,所以g ++(gcc 4.x)将字符串视为const void,但是MSVC如何处理它??
奇怪的问题:有没有其他方法可以使这个代码在两个编译器上工作,而不会使用union或* _cast来摆脱void类型? (请用标准回答,我想给MSVC粉丝一些东西:))
答案 0 :(得分:4)
字符串是常量字符的数组。这样的数组可以转换为const char*
。
请注意const限定符:const char*
,而不是char*
。将字符串文字转换为char*
是不推荐使用的(在C ++ 0x中删除)和不安全的转换。你应该制定目标const void*
。
答案 1 :(得分:3)
你已经回答了自己的问题。出于兼容性考虑,MSVC ++允许使用与纯C相同的许可,将字符串文字视为具有类型char *
而不是const char *
。要在不修复类型的情况下使其与gcc一起使用,您需要在(char *)"data"
的任何地方写"data"
。如果您不喜欢旧式演员表,const_cast<char *>("data")
也应该有效。
如果你可以改变类型甚至一点点,那么正如GMan所说,const void *
应该做的。
答案 2 :(得分:2)
不要将C字符串视为void*
。请改用const char*
。
但是,如果您因为历史原因而拥有,请将其设为const指针:const void* str = "data";
答案 3 :(得分:1)
“data”是const char [5]类型的文字,修改常量是未定义的行为。
您可以使用在堆栈上分配的字符数组:
char data[] = "example";
void* str = data;
但你为什么要这样做呢?有更安全的方法来处理文本,即std :: string为你实现RAII。