C/C++隐式void*cast与malloc

C/C++隐式void*cast与malloc,c++,c,language-lawyer,C++,C,Language Lawyer,关于以下代码片段的问题 char *p = malloc(10); 当我用gcc和any-std=编译它时,它确实编译得很好 但是使用g++with any-std=会产生错误: w.c:4:21: error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive] char *p = malloc(10); 为什么行为不同?我认为C中编译的所有行也应该用C++编译器编译。是否有任何标准要求?,因为您用GCC编译为C,用C

关于以下代码片段的问题

  char *p = malloc(10);
当我用gcc和any-std=编译它时,它确实编译得很好

但是使用g++with any-std=会产生错误:

w.c:4:21: error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]
  char *p = malloc(10);

为什么行为不同?我认为C中编译的所有行也应该用C++编译器编译。是否有任何标准要求?

,因为您用GCC编译为C,用C++编译为C++。 这些是不同的语言


从void*到C++的隐式转换,C++的类型更强。

C++不进行void*的隐式转换……您必须显式地进行转换

char *p = static_cast<char*>(malloc(10));


首先,它在这两种语言的规范中是明确的,编译器完全可以遵循这一点

虽然C++允许从指针到任意空洞的隐式转换,而C++却不允许它,但有很多很好的理由。由于C没有继承支持,所有类型的多态性都需要使用void*指针。因此,void*与void*之间的转换被认为是一个常见的用例。另外,由于C中并没有静态、动态或常量转换,若要保持指针的常量,则必须在每次void*转换时重复它


> C++具有继承性、静态性和动态性。因此,从指向任意的指针到void*和back的转换不太常见,因此必须是显式的。最后,但并非最不重要的一点是,新用法的使用将调用隐藏到MALOC,并直接给出一个指向正确类型的指针,避免每次创建动态对象时的强制窗体空缺。

< P>尽管很多人认为C++中的所有事情都可以用C++完成,但几乎相同的代码是错误的。C++不是C的超集,两者都不同。 <> P>编译器将不同,G++用于C++,而GCC用于C.<
< C++ >不是C的超集。我认为C中编译的所有行都应该用C++编译器编译。-为什么你会这样想?参见更多的例子,其中C和C++不一致。@ M·斯特劳斯特普的概述说,除了次要细节外,C++有C作为子集@ PSIALT,还请注意,您链接到的文档是一个17年前的作品。C和C++两个方面都有很大的变化。@ YSC我不认为STATICE-CAST存在问题,认为在这种情况下应该是首选的。看BTW,为什么STATICE-CAST是不正确的?C++有更严格的类型检查是一个城市传说…这种情况下的不同之处在于C具有从void*到其他对象指针类型的隐式转换,不多也不少。这两种语言都是静态类型的,并且两种语言都提供转换-只有一种语言需要转换。@M.M,要学究的话,要求转换是语言设计者的一个更严格的要求。你绝对不应该在没有第二个句子的情况下使用该句子的前半部分。@StoryTeller我同意你的观点,但是,同样迂腐的是,在这种情况下,对显式转换的要求通常会被描述为一个更严格的类型检查而不是更严格的类型检查的例子,我想。@davmac,重点是,修正了.m m静态类型与强类型无关。更重要的是,IMHO,C++有新的,它呈现MalOC和任何关联类型转换,显式或其他冗余。@ DavMAC:不冗余,因为新的自身可以使用MALOC。从应用程序程序员的角度来看,它还通过调用构造函数等@Olaf冗余来提供更高的抽象。顺便说一句,如果您想在不调用构造函数的情况下分配内存,您可以使用new char[xxx]——因此new提供了malloc所做的一切,还有更多。@Olaf语法/键入错误在您的注释中?我不明白。无论如何,我的观点是,你可以使用new/delete代替malloc/free,或者差不多。它们都分配存储空间。从这个意义上讲,存在冗余。@davmac:对不起,重试:应用程序编程的内容比个人电脑还多。
char *p = reinterpret_cast<char*>(malloc(10));