Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++_Coding Style - Fatal编程技术网

C++ 在C++;

C++ 在C++;,c++,coding-style,C++,Coding Style,我个人不喜欢像这样的老式C风格的结构声明: typedef struct {} NewType; ctags使这一类型变得丑陋,并使调试变得困难。C++代码中使用TyPulf结构而不是简单结构是否有任何原因,除了C和C++中的代码? 问候,, 瓦伦丁是一种C-ism。在C语言中,结构和枚举有效地拥有一个名称空间,因此 struct NewType {}; enum SomeEnum {}; 您必须编写struct NewType和enum SomeEnum来引用 在C++中,这不是必须的。因

我个人不喜欢像这样的老式C风格的结构声明:

typedef struct {} NewType;
ctags使这一类型变得丑陋,并使调试变得困难。C++代码中使用TyPulf结构而不是简单结构是否有任何原因,除了C和C++中的代码?

问候,, 瓦伦丁是一种C-ism。在C语言中,结构和枚举有效地拥有一个名称空间,因此

struct NewType {};
enum SomeEnum {};
您必须编写
struct NewType
enum SomeEnum
来引用


在C++中,这不是必须的。因此,除非您编写的头也需要由C编译器解析,否则您不应该使用它

这些方法的一个主要缺点

typedef struct tagSomethingSomething SomethingSomething;
也就是说,对于常用的typedef'fed名称,转发声明是不可能的


是的,这是一个C-ism(荣誉sbi),并且有C++-代码库,不幸的是,(仍然)很常见。

@sbi:我认为否:可能是错误的,但是。。在C++中,它不是一个匿名结构,有一个特殊的规则叫做“StuttHACK”,它使得一个普通的结构用TyWIFF名称标记,因此TyPIFF名称也成为类名。这是必需的,因为具有外部链接的函数要求类类型的参数也具有外部链接,这意味着具有外部名称。如果没有这种攻击,只有外部“C”函数才能操作结构

唯一可以使用匿名结构的地方是在另一个结构中:

struct X { struct {int a; } b; } x;
x.b.a; // OK

结构X具有外部链接,即使b的类型是匿名的。匿名结构可以在堆栈上或在静态存储中使用,但与匿名联合不同,它与单独的变量相比没有优势。我甚至不确定C++允许匿名结构。< /P> - 1。抱歉,我无法理解这是如何依赖于我的问题的。问题是您的原始文本错误地指出,没有标记的C样式类型定义的结构是匿名结构。这在C++中是不正确的,它们不是匿名结构,TyPulf名称被当作标签名和类名,并且结果类型甚至有外部链接。因此,实际上您应该使用非typedef表单,因为即使您在使用typedef时也对语义感到困惑,希望它仅仅是匿名结构的别名(没有外部链接)。这是一个很好的理由,我会检查一下!老实说,我正在寻找说服我的同事们不要在这种情况下使用typedef的理由。但不幸的是,除了调试器中的恼人的ANON类型(他们使用Prtf调试)和旧的C样式(他们都很自豪),我找不到任何原因。瓦伦丁:在你的征服中好运:我还有同事——在C++代码库中使用标签名和Type…C++中没有Type的参数,一个人不应该去说服别人。Cheers@Valentin:一个参数是:如何为这样的结构编写构造函数?Fritschy已经提到的转发声明是另一种声明,或者是显式的dtor调用:
Something*mySomthing;/*…*/;mySomething->~tagSomething()-那很臭。