任何非(char *)从C ++中的const字符串初始化void *的正确方法

时间:2011-04-05 02:36:51

标签: c++ visual-c++ g++

我获得了一个与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粉丝一些东西:))

4 个答案:

答案 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。