在下面的源代码中,有人可以解释一下合理性(为什么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 {
//
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句