我正在设计一个 API,它的关键部分是由 API 返回的具有大量 const 成员的结构。此外,还有 const 指针和指向 const 变量的指针。在实现内部,我需要修改这个结构。目前,我已经定义了完全相同的结构,但删除了 const 关键字和不同的名称。在 API 调用中,我只是将外部结构转换为内部结构。
有没有更好的编码方式?如果我修改了一个结构而忘记了另一个,当前的设计很容易出错。
在这里请注意:这些字段并不是真正不可写的。
你想让它们有点“私有”,但每个程序员都可以通过这种方式访问它们:
typedef struct
{
const int x;
}mystruct;
然后:
mystruct ms= {0};
*((int*)&(ms.x)) =4;
printf("%d",ms.x);
因为 const 说明符只是阻止程序员在编译时修改它们。但在运行时内存不是只读的。
我仍然认为 const 说明符很有用:如果一个优秀的程序员看到它,就会说我不应该访问该字段。如果相反,想让聪明人访问这些字段并可能冒着不一致的状态的风险。
因此,如果您确定可以更改这些 const 字段,那么在您的位置我会使用这种方式。我知道迂腐的程序员不会喜欢它,我也不喜欢它,但有时我们必须绕过它。
复制是万恶之源,因此您可以执行以下操作,而不是复制结构定义:
#ifndef CONST
#define CONST const
#endif
struct mystruct
{
CONST void * my_data;
};
现在您只需CONST
在私有实现中包含头文件之前定义为空。
但是,就像其他答案所暗示的那样,这不是一个好主意。首先,可能有更好、更清洁的方法来实现你想要的。其次,这可能会导致奇怪和不需要的结果,因为编译器可能会使用字段的常量来优化代码。
简而言之,我认为你最好重新考虑你的 API。