假设我有这样的代码:
void foo (void *ptr) {
const struct some *azaza = (const struct some *)ptr;
azaza->some_field = 123; // inadvertently assignment => error
// ...
转换中真的需要 const
说明符吗?
编辑:foo
是具有特定原型(prototype) 的回调 函数,我无法更改(它不是在我的代码中)。
最佳答案
在您的特定情况下,您甚至不需要强制转换。如果是 void *
只有在取消引用时才需要转换。所以这样做就足够了:
const struct some *azaza = ptr;
但是为了兴趣,
#gcc test.c
:
// 1)
const struct some *azaza = ptr;
azaza->some_field = 123; // error: assignment in read-only object
// 2)
struct some *azaza = (const struct some *)ptr; // (!)warning: initialization discards ‘const’ qualifier
azaza->some_field = 123;
#gcc test.c -pedantic-errors
:
// 1)
const struct some *azaza = ptr;
azaza->some_field = 123; // error: assignment in read-only object
// 2)
struct some *azaza = (const struct some *)ptr; // error: initialization
// discards ‘const’ qualifier
azaza->some_field = 123;
总结:
- 在转换中不需要
const
。 - 如果您仅在转换中使用
const
(出于某些奇怪的原因 ._.)并且没有-pedantic-errors
- 意外赋值不会导致充满后果的错误。
关于c - const 说明符在 cast 中的必要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56398708/