【发布时间】:2016-03-12 16:06:12
【问题描述】:
我有一个公共函数,它对缓冲区执行读取操作并执行摘要。它有一个const uint8_t * 参数。
void do_digest(const uint8_t *buf, size_t size);
在内部,我将所有指针大小对包装在一个简单的缓冲区结构中:
typedef struct {
uint8_t *buf;
size_t size;
} myBuffer;
但是,作为一个迂腐的开发人员,我想摆脱一个警告,指出当分配给 myBuffer 结构时,参数的常量被剥离。
myBuffer foo = { buf, size }; // Warning: discards 'const' qualifier
因此,最简单和最明确的解决方案是创建一个与 const 缓冲区一起使用的新结构类型:
typedef struct {
const uint8_t *buf;
size_t size;
} myConstBuffer;
myConstBuffer cfoo = { buf, size }; // No warnings, woohoo!
但是,有一个问题;在内部,我传递指向这些缓冲区结构的指针。现在,如果我有一个可变的 myBuffer 实例并且我想将它传递给一个接受 myConstBuffer 指针的函数,我会收到一条警告,抱怨类型不兼容。
void some_internal_func(const myConstBuffer *b);
...
myBuffer mutable_buf = { ... };
some_internal_func(&mutable_buf); // Warning: incompatible types.
好像我在用一个警告换另一个警告。有没有更好的解决方案?
提前致谢。
【问题讨论】:
-
为什么需要 constBuffer 和 buffer?只需让 const 指针成为缓冲区的成员。
-
“警告”实际上是格式错误的代码(一些编译器说“警告”并插入虚构的强制转换),所以想要解决这个问题不仅仅是迂腐
-
这个问题没有真正好的解决方案。您拥有的一个工具是创建一个接受
myBuffer并返回myConstBuffer的函数;那么你至少避免强制转换