在下面的源代码中,有人可以解释理性(为什么好的编程习惯 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 标识符具有不同的 namespace 。请看Why doesn't ANSI C have namespaces?有关 C 中命名空间的信息。
然而,许多专业用户避免这种情况,并为结构和类型定义使用不同的名称。 MISRA1 也不允许这样做。
Rule 5.6 (advisory): No identifier in one name space should have the same spelling as an identifier in another name space, with the exception of structure member and union member names. [MISRA C 2004]
下划线的使用只是一些人遵循的约定。您可以遵循其他约定,例如
typedef struct sTag_lwm2m_object_t lwm2m_object_t;
struct sTag_lwm2m_object_t {
//
}
关于c - 为什么在 c 中对结构使用下划线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44020831/