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

riv*_*ock 0 c standards struct typedef

在下面的源代码中,有人可以解释理性(为什么使用新名称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;
};
Run Code Online (Sandbox Code Playgroud)

Ris*_*aje 6

实际上如果你使用

typedef struct lwm2m_object_t lwm2m_object_t;

struct lwm2m_object_t {
//
}
Run Code Online (Sandbox Code Playgroud)

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

但是,许多专业用户会避免这种情况,并对结构和typedef使用不同的名称.MISRA 1也不允许这样做.

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

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

typedef struct sTag_lwm2m_object_t lwm2m_object_t;

struct sTag_lwm2m_object_t {
//
}
Run Code Online (Sandbox Code Playgroud)

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