在C / C ++中进行转换有什么问题?

时间:2014-05-23 14:22:55

标签: c++ c casting

这不是一个特定的代码问题,更多是关于我一直得到的一些反馈的一般性问题。我经常编写C / C ++代码(这并不是说我擅长它,但这是另一个故事),偶尔我会抛出一个指针,例如:

void **result = (void **) malloc(size);

据我所知,在这种特殊情况下,我不需要它,编译器应该为我处理它。但是,每当有人看到我的代码时,我似乎总是对我投出这些变量的事实嗤之以鼻。使用铸造有什么固有的错误吗?

3 个答案:

答案 0 :(得分:3)

答案与C和C ++不同。你在C should not cast the return value of malloc 在C ++中,你必须要投射它。

答案 1 :(得分:2)

你的问题的标题是指铸造的一般用法。从malloc上的例子来看,似乎你在c ++中询问c风格的转换。 在c ++中,你应该避免使用c风格的转换。 代替(T)(a) 根据具体情况,您应使用以下4种类型的一种:

static_cast <T> (a)
dynamic_cast <T> (a)
const_cast <T> (a)
reinterpret_cast <T> (a)

使用这些c ++类型的转换,使代码更安全,更全面。

一个很好的教程可以在药草sutter中找到: GotW #17-Casts

还有关于C ++演员的帖子: When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

答案 2 :(得分:1)

这样的演员表似乎没用,但如果我没错,他们会允许一些编译器知道该怎么做。
如果您正在使用某些标志进行编译(我建议您这样做),它会解决警告问题,并使您的代码可移植。而且,它证明了你真正理解你正在做的事情。

我只想补充一点,你的示例(使用malloc)应该只与C代码一起使用。对于c ++,建议使用&#39; new&#39; )。 C中的演员阵容就是这样使用的:

    int        *tab;

    tab = (int *)malloc(theSize * sizeof(*tab));

这是C中的干净malloc;)