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

标签 c struct standards 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;
};

最佳答案

实际上如果你使用

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 {
//
}

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

关于c - 为什么在 c 中对结构使用下划线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44020831/

相关文章:

c - Linux C套接字

c++ - memcpy 定义的位置

在此 C 编程案例中,C99 命令行不打印任何内容

c - 如何从C中的结构体中获取字符串?

c - C 中的默认参数和参数提升

c - 使用损坏的 xml 中存在的 xml 的有效部分

python - 为什么特定算法通过 ctypes 花费的时间明显更长?

c - 在 time.h 中找不到 timespec

c++ - C/C++ int[] vs int*(指针 vs. 数组表示法)。有什么区别?

python - 在一个文件中编写整个 Flask 应用程序是一种不好的做法吗?