这不是一个特定的代码问题,更多是关于我一直得到的一些反馈的一般性问题。我经常编写C / C ++代码(这并不是说我擅长它,但这是另一个故事),偶尔我会抛出一个指针,例如:
void **result = (void **) malloc(size);
据我所知,在这种特殊情况下,我不需要它,编译器应该为我处理它。但是,每当有人看到我的代码时,我似乎总是对我投出这些变量的事实嗤之以鼻。使用铸造有什么固有的错误吗?
答案 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;)