【发布时间】:2017-10-16 16:17:26
【问题描述】:
在下面的源代码中,有人可以解释一下理性(为什么 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 的名字和 typedef 的名字冲突
-
我认为这不是一个好主意。 A)这是一个标准违规。文件范围和标记命名空间中以下划线开头的所有标识符都是保留的,B)它不必要地乱扔你的全局命名空间。不必要,因为您可以为 struct 标记和 typedef (
typedef struct foo foo;) 使用相同的名称——C++ 甚至内置到语言中的约定。 -
“文件范围内的所有标识符和以下划线开头的标签命名空间都是保留的” - 你知道吗?不完全是。
-
@Bathsheba port70.net/~nsz/c/c11/n1570.html#7.1.3 第二个要点
-
这说明了为什么你永远不应该相信互联网上的任何东西 ;-)
标签: c struct standards typedef