gpt4 book ai didi

const *const 函数参数中的指针

转载 作者:行者123 更新时间:2023-12-04 07:40:31 32 4
gpt4 key购买 nike

我有一个关于在函数参数中涉及指针的最佳实践以及它们是否应该指定为 *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 的事情而不是 item->data = data .
下一个级别是定义 dataconst void *const这意味着你也不能改变什么 data指着。但是,这会导致有关丢弃 const 的警告。来自指针的限定符。如果我理解正确,进一步使用这样的指针被认为是未定义的行为。使用类型转换( item->data = (void *)data )似乎很笨拙。
这里最好的方法是什么?是 const void *const不必要的过度保护?感觉就像 void *const足以捕获大多数错误。

最佳答案

由于对函数参数的更改不会反射(reflect)在调用函数中,因此几乎没有理由确保参数本身是只读的。然而,确保指针参数指向的内容不会改变是很有用的。所以如果你不想要什么 data要更改的点,您可以将函数签名更改为:

void enqueue(struct queue *q, const void *data)
请注意,这仅适用于 data struct queue_node成员(member)有类型 const void * .如果没有,那么您不想使用 constdata范围。

关于const *const 函数参数中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67506225/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com