Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用C/C++;?_C++_C_Casting - Fatal编程技术网

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++中,你必须要把

这不是一个具体的代码问题,更多的是关于我得到的一些反馈的一般性问题。我经常编写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释放它。您知道这样一个库吗?我得说它坏得不能用了。我知道的所有图书馆