Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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++;正确性,struct/union/enum标记是否与type name相同?_C++_C_Coding Style_Typedef - Fatal编程技术网

C++ C样式/C++;正确性,struct/union/enum标记是否与type name相同?

C++ C样式/C++;正确性,struct/union/enum标记是否与type name相同?,c++,c,coding-style,typedef,C++,C,Coding Style,Typedef,下面的MyStruct定义(tagmystruct)和类型MyStruct的类型定义似乎完全可以由gcc(至少4.6.2)和g++编译 typedef struct MyStruct { int a; int b; } MyStruct; 我的问题是:使用与类型名相同的标记名是否容易出错(在C和/或C++中)或错误样式? 据认为,这不是: 我一直不明白为什么他们对标记和typedef使用不同的名称,而一个名称就可以了: typedef struct tree_node tree_nod

下面的MyStruct定义(tagmystruct)和类型MyStruct的类型定义似乎完全可以由gcc(至少4.6.2)和g++编译

typedef struct MyStruct {
  int a;
  int b;
} MyStruct;
我的问题是:使用与类型名相同的标记名是否容易出错(在C和/或C++中)或错误样式?

据认为,这不是:

我一直不明白为什么他们对标记和typedef使用不同的名称,而一个名称就可以了:

typedef struct tree_node tree_node;
但我经常看到这样的代码:

  • typedef struct tagMyStruct{…}MyStruct
  • typedef struct myStruct{…}myStruct`
  • typedef结构_MyStruct{…}MyStruct<是的,我知道下划线+大写字母
  • 在每种情况下,都有人在某种程度上使标记名和类型名不同。这背后有什么实际原因吗

    旁注:我使用C++编译器,但我希望C++与这些定义兼容(我知道这是C++的坏样式)。为了保持某些调试工具的可用性,我需要所有标记名都是有意义的(对于未命名的结构,不是自动生成的uuu unknown_something标记,例如,可以在visual studio类视图中查看)


    相同的问题适用于联合和枚举。

    struct Foo在不同的命名空间中声明struct。因此,“struct Foo”和“Foo”不能相互干扰


    执行
    typedef struct\u foo{}foo的原因对我来说不是很清楚。可能是指针的残余(<代码> Type Fue{Fo}{Fo},Pfoo,)Type Debug。

    < P>语言,C和C++中都是完全可以的,因为标签名存在于单独的名称空间(不是<代码>命名空间< /代码>)。p> 在C++中,使用“<代码> TyPulf< /COD>”绝对是坏的风格,因为它是多余的。无论您是否拥有
    typedef
    ,都可以同时使用
    MyStruct
    struct MyStruct


    <>如果你认为C兼容性比C++风格更重要,那就是你的选择。p> 从技术上讲,没有理由要求名称不同,大量代码都是使用相同的名称编写的。重要的是在您自己的代码中保持一致

    可以说过度使用
    typedef
    会污染名称空间,这可能是真的。我使用的经验法则是:如果我要经常使用它,请使用
    typedef
    ,否则不要使用

    另外,如果我使用的是
    typedef
    ,我不会命名
    struct
    ,所以我会这样编码:

    typedef struct {
        int a;
        int b;
    } struct_t;
    
    这样我就必须始终如一地使用它,而一致性是良好编码风格的关键

    因为C(可以)通过一次编译实现,所以在未创建typedef时自引用它是一个错误。这是无效的

    typedef struct {
      Foo *next;
      int i;
    } Foo;
    
    因此,


    当您想将其称为
    Foo
    而不是
    struct Foo
    时。请参阅以供讨论。

    只要您没有与标记同名的其他标识符,您就可以将该名称同时用于标记和typedef。我假设人们为了安全起见避免使用相同的名称,因为
    struct foo
    不会与
    foo
    冲突这一事实不是常识,程序员的直觉会建议避免重复使用相同的名称。在C语言中,许多人会认为使用typedef是不好的风格,因此它的名称是不相关的。@oddstar:尽管人们这样做,但实际上相反的做法更安全:在两种上下文(struct标记和常规标识符)中重复使用相同的名称表示您在这两种情况下都保留了该名称,这可以防止在其他人试图在其他上下文中使用相同名称时出现任何混乱的非冲突。@Steve不透明类型和消除混淆声明(例如定义函数指针类型的typedefing)是,typedef的唯一适当用法。应该注意的是,您的答案是C-特定的。因此,您说,将标签和类型命名为相同的“因为它是冗余的”-从形式上讲,它不是冗余的,因为它起到了不同的作用。使用它可以阻止一些小丑声明名为
    MyStruct
    的函数(或其他实体)。实际上,你只需要指望人们在工作场所不会那么热衷于恶作剧。我也一直在使用你的风格,但出于某种原因,使用MS symbol engine(这可能是msc/visual studio特有的)查看未命名的结构显然更难。你可以查看你的.PDB文件,看到实际上标记名存储在那里,而不是类型名,至少我看到的是这样。因为我不使用MS工具,所以我不熟悉这个问题。但确实,在符号表中,您不会获得匿名结构的
    typedef
    的类名。如果这给调试带来了麻烦,那么您可能需要使用不同的策略。事实上,我不像C++那样使用TyPuffF和C++差不多。
    typedef struct tagFoo {
      struct tagFoo *next;
      int i;
    } Foo;