gpt4 book ai didi

c - 当 super 结构引用非常量时如何使用 const C 结构?

转载 作者:太空宇宙 更新时间:2023-11-04 00:04:43 25 4
gpt4 key购买 nike

考虑以下示例:

typedef struct Collection
{
...
} Collection;

typedef struct Iterator
{
Collection* collection;
} Iterator;

Iterator 提供集合修改函数,因此它持有非常量集合的地址。但是,它还提供非修改函数,这些函数与 const 集合一起使用是完全合法的。

void InitIterator(Iterator* iter, Collection* coll)
{
iter->collection = coll;
}

void SomeFunction(const Collection* coll)
{
// we want to use just non-modifying functions here, as the Collection is const
Iterator iter;
InitIterator(&iter, coll); // warning, call removes const qualifier
}

我正在寻找 C 的解决方案。我确实看到了一些选项:

1. 在 Init 中,将 Collection 转换为非常量。这可能不是未定义的行为,因为对象最终不应该被修改。但这是令人毛骨悚然的,因为有一个 const 对象,这样做是自找麻烦。迭代器将成为一种广泛使用的通用机制来处理集合。在修改常量集合时没有编译器警告真的很糟糕。

2. 两种迭代器类型,一种是具有 const Collection* 成员的只读版本。这使使用变得复杂,可能需要重复某些功能,可能由于翻译步骤而降低效率。我真的不想让 API 复杂化,并且有两个不同的结构和两组函数。

3. Iterator 有两个指针,Init 有两个 Collection 指针。

typedef struct Iterator
{
const Collection* collectionReadable; // use this when reading
Collection* collectionWritable; // use this when writing
} Iterator;

当拥有一个 const 集合时,非 const 参数必须变为 NULL,最终尝试修改该集合会崩溃(尝试取消引用 NULL 指针),这很好(安全)。我们有额外的存储成本。这很尴尬,取同一个集合的两个指针。

我也有点担心编译器在同一上下文中看到两个指针,这意味着如果通过可写指针修改集合,编译器必须意识到只读指针可能指向同一个对象并且尽管有 const 限定符,它仍需要重新加载。这样安全吗?

您会选择哪一个,为什么?您知道解决此问题的更好方法吗?

最佳答案

是的,有两个指向同一个对象的指针是安全的,一个是常量,另一个是非常量。 const 仅表示不能通过该特定指针修改对象,但如果存在此类指针,则可以通过其他指针对其进行修改。然而,虽然它是安全的,但这并不一定意味着你应该选择拥有两个指针的解决方案。

有关完美运行的代码示例,请参阅:

int x = 5;
const int *p = &x;
printf("%d\n", *p);
x = 7;
printf("%d\n", *p);

现在 *p 改变了,即使 p 是一个 const 指针。

您的目标是避免代码重复,因此您只需将 const 指针转换为非常量指针。只要您不修改对象,它就是安全的。 C 标准库中有很多类似的例子。例如,strchr() 将一个 const char 指针放入字符串中,然后返回一个 char 指针,以防万一字符串不是 const 并且您想通过返回值修改它。我会选择 C ​​标准库中采用的解决方案,即类型转换。

您基本上已经注意到 C 中的 const 限定符并不完美。当您遇到这样的问题时,有很多用例,最简单的方法通常是接受它并不完美并进行类型转换。

关于c - 当 super 结构引用非常量时如何使用 const C 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29183003/

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