C++ 用C/C++;?
这不是一个具体的代码问题,更多的是关于我得到的一些反馈的一般性问题。我经常编写C/C++代码(这并不是说我很擅长,但那是另一回事),偶尔我会抛出一个指针,例如:C++ 用C/C++;?,c++,c,casting,C++,C,Casting,这不是一个具体的代码问题,更多的是关于我得到的一些反馈的一般性问题。我经常编写C/C++代码(这并不是说我很擅长,但那是另一回事),偶尔我会抛出一个指针,例如: void **result = (void **) malloc(size); 我明白在这种特殊情况下,我不需要它,编译器应该为我处理它。然而,每当其他人看我的代码时,我似乎总是得到一些关于我抛出这些变量这一事实的讽刺评论。使用铸造有什么本质上的错误吗?< /P> < P>对于C和C++,答案是不同的。在C你。 在C++中,你必须要把
void **result = (void **) malloc(size);
我明白在这种特殊情况下,我不需要它,编译器应该为我处理它。然而,每当其他人看我的代码时,我似乎总是得到一些关于我抛出这些变量这一事实的讽刺评论。使用铸造有什么本质上的错误吗?< /P> < P>对于C和C++,答案是不同的。在C你。
在C++中,你必须要把它投出来。 < P>答案对于C和C++是不同的。在C你。
在C++中,你必须要把它投射出来。 < P>你的问题的标题是指铸造的一般用法。从MALOC的例子来看,你似乎在问C++中的C风格的铸造。 在C++中,你应该避免使用C风格的铸件。 代替(T)(a) 根据具体情况,应使用以下4种类型的铸件之一:
static_cast <T> (a)
dynamic_cast <T> (a)
const_cast <T> (a)
reinterpret_cast <T> (a)
static\u cast(a)
动态投影(a)
施工图(a)
重新解释演员阵容(a)
使用C++类型转换,使代码更安全,更全面。 赫伯·萨特(herb sutter)提供了一个很棒的教程:
和C++上的帖子也是如此:
您问题的标题指的是铸造的一般用法。从MALOC的例子来看,你似乎在问C++中的C风格的铸造。 在C++中,你应该避免使用C风格的铸件。 代替(T)(a) 根据具体情况,应使用以下4种类型的铸件之一:
static_cast <T> (a)
dynamic_cast <T> (a)
const_cast <T> (a)
reinterpret_cast <T> (a)
static\u cast(a)
动态投影(a)
施工图(a)
重新解释演员阵容(a)
使用C++类型转换,使代码更安全,更全面。 赫伯·萨特(herb sutter)提供了一个很棒的教程:
和C++上的帖子也是如此:
这样的强制转换似乎没有用,但如果我没有错的话,它们允许某些编译器知道该做什么。
首先,如果您使用一些标志进行编译(我建议您这样做),它会解决警告,并使您的代码可移植。此外,这证明你真的了解自己在做什么 我只想补充一点,您的示例(使用malloc)应该只与C代码一起使用。对于C++,建议使用“新”;C中的类型转换的使用方式如下:
int *tab;
tab = (int *)malloc(theSize * sizeof(*tab));
这是C中的一个干净malloc;) 这样的强制转换似乎没有用,但如果我没有错的话,它们允许一些编译器知道该做什么。
首先,如果您使用一些标志进行编译(我建议您这样做),它会解决警告,并使您的代码可移植。此外,这证明你真的了解自己在做什么 我只想补充一点,您的示例(使用malloc)应该只与C代码一起使用。对于C++,建议使用“新”;C中的类型转换的使用方式如下:
int *tab;
tab = (int *)malloc(theSize * sizeof(*tab));
这是C中的一个干净malloc;) 提供我知道的不铸造的原因。在许多情况下,拥有不需要的代码本身就是一个问题。我认为演员阵容非常像是在代码中尖叫,演员阵容的信号是“神圣的cr*p,现在我这样做了”。因此,当它们不需要时,它们永远不应该被使用,因为它会用大量的冗长的叫喊来加载代码。当然,C不需要强制转换,C++不需要MalCube()。因此,这是不合时宜的。不要编写C/C++代码,这种语言不存在。“C/C++代码相当频繁”中的相关部分提供了我知道的不强制转换的原因。在许多情况下,拥有不需要的代码本身就是一个问题。我认为演员阵容非常像是在代码中尖叫,演员阵容的信号是“神圣的cr*p,现在我这样做了”。因此,当它们不需要时,它们永远不应该被使用,因为它会用大量的冗长的叫喊来加载代码。当然,C不需要强制转换,C++不需要MalCube()。因此,这是不合时宜的。不要编写C/C++代码,语言不存在。C++中的“C/C++代码相当频繁”的相关章节,你不应该使用<代码> MalOC 。(对于在C中没有铸造<代码> MalOC 的返回值,意见不同。我不喜欢它,但我知道一些非常优秀的C程序员不同意——包括一些在C被创建的站点。)JAMESKANZE:在C++中有很多理由使用<代码> MalOC/<代码>。包括传递一个指向一个库方法的指针,该库方法将获得内存的所有权,然后使用
free
@EricLippert释放它。您知道这样一个库吗?我得说它坏得不能用了。我知道的所有库都有特殊的内存分配例程,它们可能必须删除这些例程。当存在类型安全的替代方案时,使用malloc
还有什么其他原因呢?@JamesKanze:好的API设计包括用于分配和解除分配的自定义方法,这一点您是完全正确的。我向您保证,有许多公司拥有许多遗留库,这些库是由那些在API设计最佳实践方面没有扎实背景的人设计的。@JamesKanze:您这样问还有第二个原因realloc
可以比std::vector
的resize
具有更好的性能;如果这是你程序中的一个热点,那么使用更高性能的替代方案是合理的。在C++中,你不应该使用<代码> MalOC 。(对于在C中没有铸造<代码> MalOC 的返回值,意见不同。我不喜欢它,但我知道一些非常优秀的C程序员不同意——包括一些在C被创建的站点。)JAMESKANZE:在C++中有很多理由使用<代码> MalOC/<代码>。包括传递一个指向一个库方法的指针,该库方法将获得内存的所有权,然后使用free
@EricLippert释放它。您知道这样一个库吗?我得说它坏得不能用了。我知道的所有图书馆