【问题标题】:Is this a coding convention?这是编码约定吗?
【发布时间】:2011-07-13 08:19:59
【问题描述】:

我正在对一段代码进行功能增强,这是我在现有代码中看到的。如果声明了枚举或结构,那么后面总会有一个typedef:

enum _Mode {
   MODE1 = 0,
   MODE2,
   MODE3
};
typedef enum _Mode Mode;

结构类似:

struct _Slot {
     void * mem1;
     int mem2;
};
typedef struct _Slot Slot;

结构不能直接声明为枚举吗? 为什么对于像下划线这样小的东西有一个 typedef?这是编码约定吗?

请给出好的答案,因为我需要添加一些代码,如果这是一个规则,我需要遵循它。

请帮忙。 P.S:作为补充说明,源代码是用 C 编写的,Linux 是平台。

【问题讨论】:

    标签: c linux coding-style


    【解决方案1】:

    在 C 中,要声明具有结构类型的变量,您必须使用以下内容:

    struct _Slot a;
    

    typedef 允许您通过本质上创建别名来使其看起来更整洁。并允许像这样声明变量:

    Slot a;
    

    【讨论】:

    • 你的回答看起来更合乎逻辑。
    【解决方案2】:

    C 中,structtypedef 有单独的“命名空间”。因此,如果没有 typedef,您将不得不以 struct _Slot 的形式访问 Slot,这需要更多的输入。比较:

    struct Slot { ... };
    
    struct Slot s;
    struct Slot create_s() { ... }
    void use_s(struct Slot s) { ... }
    

    typedef struct _Slot { ... } Slot;
    
    Slot s;
    Slot create_s() { ... }
    void use_s(Slot s) { ... }
    

    另请参阅http://en.wikipedia.org/wiki/Struct_(C_programming_language)#typedef 了解详细信息,例如可能的命名空间冲突。

    【讨论】:

    • 那么为什么不将结构声明为struct Slot 而不是struct _Slot
    • 我赞成你的回答,但我接受第一个,因为 _(下划线)的原因在此处更好地提及。
    【解决方案3】:

    如果以下是结构体:

    struct _Slot {
         void * mem1;
         int mem2;
    };
    

    您需要以下内容来声明变量:

    struct _Slot s;
    

    注意_Slot 之前的额外struct。声明像Slot s 这样的变量似乎更自然,不是吗?

    如果你想摆脱多余的struct,你需要一个typedef

    typedef struct _Slot Slot;
    Slot s;
    

    【讨论】:

    • 与我对@vines 的评论相同。在这种情况下,我们可以将 struct 声明为 struct Slot,然后再声明 typedef struct Slot Slot
    • @kingsmasher1:所有三个答案对我来说都一样。 :)
    【解决方案4】:

    这是一种代码混淆技术,仅在少数情况下才有意义。

    人们说不写“结构”和其他主观的东西更自然。

    但客观地说,至少有一个 a) 不能前向声明这种类型定义的结构,b) 使用 ctags 时必须跳过一圈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2013-11-10
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多