在下面的源代码中,有人可以解释理性(为什么编程练习typedef
结构_lwm2m_object_t
新名称lwm2m_object_t
?它只是删除下划线?为什么在第一次使用下划线?为什么要在C中为结构使用下划线?
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;
};
它不需要在使用类型的地方使用'struct'。下划线是为了防止非typedef的名称和typedef的名称之间的冲突 – Toby
我不认为这是个好主意。 A)这是一种标准违规行为。文件范围和标记命名空间中以下划线开头的所有标识符都被保留,B)它不必要地丢弃全局命名空间。不必要的,因为你可以为你的struct标记和你的typedef('typedef struct foo foo;')使用相同的名字 - 这是一种C++甚至构建到语言中的约定。 – PSkocik
“文件范围内的所有标识符和以下划线开头的标记名称空间都被保留” - U wot?不完全的。 – Bathsheba