为什么在 c 中为结构使用下划线?

河石

在下面的源代码中,有人可以解释一下合理性(为什么typedef_lwm2m_object_t具有新名称的结构体进行良好的编程实践lwm2m_object_t?它所做的只是删除下划线?为什么在第一个实例中使用下划线?

typedef struct _lwm2m_object_t lwm2m_object_t;

typedef uint8_t (*lwm2m_read_callback_t) (lwm2m_uri_t * uriP, char ** bufferP, int * lengthP, lwm2m_object_t * objectP);
typedef uint8_t (*lwm2m_write_callback_t) (lwm2m_uri_t * uriP, char * buffer, int length, lwm2m_object_t * objectP);
typedef uint8_t (*lwm2m_execute_callback_t) (lwm2m_uri_t * uriP, char * buffer, int length, lwm2m_object_t * objectP);
typedef uint8_t (*lwm2m_create_callback_t) (lwm2m_uri_t * uriP, char * buffer, int length, lwm2m_object_t * objectP);
typedef uint8_t (*lwm2m_delete_callback_t) (uint16_t id, lwm2m_object_t * objectP);
typedef void (*lwm2m_close_callback_t) (lwm2m_object_t * objectP);


struct _lwm2m_object_t
{
    uint16_t                 objID;
    lwm2m_list_t *           instanceList;
    lwm2m_read_callback_t    readFunc;
    lwm2m_write_callback_t   writeFunc;
    lwm2m_execute_callback_t executeFunc;
    lwm2m_create_callback_t  createFunc;
    lwm2m_delete_callback_t  deleteFunc;
    lwm2m_close_callback_t   closeFunc;
    void *                   userData;
};
瑞诗凯诗拉杰

其实如果你使用

typedef struct lwm2m_object_t lwm2m_object_t;

struct lwm2m_object_t {
//
}

C 仍然允许它。这是因为结构名称和 typedef 标识符具有不同的命名空间。请参阅为什么 ANSI C 没有命名空间?有关 C 中命名空间的信息。

然而,许多专业用户避免这种情况,并为结构和类型定义使用不同的名称。MISRA 1也不允许这样做。

规则 5.6(建议):一个名称空间中的标识符不应与另一个名称空间中的标识符拼写相同,但结构成员和联合成员名称除外。[MISRA C 2004]

下划线的使用只是一些人遵循的约定。您可以遵循其他约定,例如

typedef struct sTag_lwm2m_object_t lwm2m_object_t;

struct sTag_lwm2m_object_t {
//
}

1 https://en.wikipedia.org/wiki/MISRA_C

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C语言中,为什么某些函数名称前缀为“ _ _”(双下划线)

来自分类Dev

为什么将下划线设置为等于函数?

来自分类Dev

为什么“IsPost”和“AsPost”下划线为红色?

来自分类Dev

下划线作为C中的参数是什么意思?

来自分类Dev

在目标c中对实例变量使用下划线

来自分类Dev

为什么括号“()”在 CSS 中没有下划线?

来自分类Dev

为什么在下划线中使用typeof(/./)!=='function'

来自分类Dev

为什么下划线使用`root`而不是`this`?

来自分类Dev

为什么在视图模型中声明变量时使用下划线Kotlin约定

来自分类Dev

为什么函数参数名称中不允许使用下划线?

来自分类Dev

UIButton在目标c中的下划线

来自分类Dev

在C中使用双下划线

来自分类Dev

Kotlin中的下划线保留什么?

来自分类Dev

为什么BEM经常使用两个下划线而不是一个下划线?

来自分类Dev

为变量分配下划线。下划线在做什么?

来自分类Dev

为什么我需要在下划线中命名索引中的属性?

来自分类Dev

为什么链接中的目标属性带有下划线?

来自分类Dev

为什么在Twilio Rest API中,“ from”后面有一个下划线?

来自分类Dev

为什么Java关键字列表中没有_(下划线)?

来自分类Dev

下划线作为Java中的变量名。为什么?

来自分类Dev

为什么Java关键字列表中没有_(下划线)?

来自分类Dev

为什么函数_wtoi中的wtoi之前的下划线是哪个ansi版本是atoi?

来自分类Dev

为什么Rails中的局部变量以下划线开头?

来自分类Dev

为什么路径名中的下划线会使Perl脚本挂起?

来自分类Dev

为什么下划线像python 3 re库中的通配符一样匹配

来自分类Dev

为什么我不能在Linux上使用前导或尾随下划线来ping地址

来自分类Dev

为什么要在x === undefined上使用下划线的isUndefined(x)?

来自分类Dev

为什么我不能使用下划线flatMap一个List [Option]?

来自分类Dev

为什么下划线使用对象作为破坏者

Related 相关文章

  1. 1

    在C语言中,为什么某些函数名称前缀为“ _ _”(双下划线)

  2. 2

    为什么将下划线设置为等于函数?

  3. 3

    为什么“IsPost”和“AsPost”下划线为红色?

  4. 4

    下划线作为C中的参数是什么意思?

  5. 5

    在目标c中对实例变量使用下划线

  6. 6

    为什么括号“()”在 CSS 中没有下划线?

  7. 7

    为什么在下划线中使用typeof(/./)!=='function'

  8. 8

    为什么下划线使用`root`而不是`this`?

  9. 9

    为什么在视图模型中声明变量时使用下划线Kotlin约定

  10. 10

    为什么函数参数名称中不允许使用下划线?

  11. 11

    UIButton在目标c中的下划线

  12. 12

    在C中使用双下划线

  13. 13

    Kotlin中的下划线保留什么?

  14. 14

    为什么BEM经常使用两个下划线而不是一个下划线?

  15. 15

    为变量分配下划线。下划线在做什么?

  16. 16

    为什么我需要在下划线中命名索引中的属性?

  17. 17

    为什么链接中的目标属性带有下划线?

  18. 18

    为什么在Twilio Rest API中,“ from”后面有一个下划线?

  19. 19

    为什么Java关键字列表中没有_(下划线)?

  20. 20

    下划线作为Java中的变量名。为什么?

  21. 21

    为什么Java关键字列表中没有_(下划线)?

  22. 22

    为什么函数_wtoi中的wtoi之前的下划线是哪个ansi版本是atoi?

  23. 23

    为什么Rails中的局部变量以下划线开头?

  24. 24

    为什么路径名中的下划线会使Perl脚本挂起?

  25. 25

    为什么下划线像python 3 re库中的通配符一样匹配

  26. 26

    为什么我不能在Linux上使用前导或尾随下划线来ping地址

  27. 27

    为什么要在x === undefined上使用下划线的isUndefined(x)?

  28. 28

    为什么我不能使用下划线flatMap一个List [Option]?

  29. 29

    为什么下划线使用对象作为破坏者

热门标签

归档