【发布时间】:2023-03-20 03:40:01
【问题描述】:
我有一个关于函数参数中涉及指针的最佳实践以及是否应将它们指定为*const 或const *const 的问题。我知道对于const 的使用或过度使用有不同的看法,但至少有一些使用是捕捉意外错误的好方法。
假设你有以下函数,它是基于链表的队列实现的一部分:
void enqueue(struct queue *q, void *data)
{
struct queue_node *item = malloc(sizeof(*item));
item->data = data;
[add node to linked list, specifics are not relevant here]
}
struct queue_node 定义为
struct queue_node {
struct queue_node *next;
void *data;
};
data 不打算在此函数中进行修改,因此将data 设置为void *const 类型似乎是个好主意,这样您就不会意外地执行data = item->data 之类的操作而不是@987654331 @。
下一个级别是将data 定义为const void *const,这意味着您也无法更改data 指向的内容。但是,这会导致有关从指针中丢弃 const 限定符的警告。如果我理解正确,进一步使用这样的指针被认为是未定义的行为。使用演员表 (item->data = (void *)data) 似乎很笨重。
这里最好的方法是什么? const void *const 是否过度保护?感觉void *const 足以捕获大多数错误。
【问题讨论】:
-
如果
item->data的类型为void *,我认为data参数为void *或void * const是有意义的,即使该函数不会修改指向的对象data。如果item->data的类型为const void *,我只会使用const void * data或const void * const data。