2

我正在设计一个 API,它的关键部分是由 API 返回的具有大量 const 成员的结构。此外,还有 const 指针和指向 const 变量的指针。在实现内部,我需要修改这个结构。目前,我已经定义了完全相同的结构,但删除了 const 关键字和不同的名称。在 API 调用中,我只是将外部结构转换为内部结构。

有没有更好的编码方式?如果我修改了一个结构而忘记了另一个,当前的设计很容易出错。

4

3 回答 3

5

使用不透明的结构和访问器函数

不透明结构为您的 API 提供了一个名称,但无法解决这些字段。

API 中的访问器函数提供您喜欢的任何受控访问。

于 2012-12-26T22:52:40.540 回答
0

在这里请注意:这些字段并不是真正不可写的。
你想让它们有点“私有”,但每个程序员都可以通过这种方式访问​​它们:

typedef struct
{
    const int x;
}mystruct;

然后:

mystruct ms= {0};
*((int*)&(ms.x)) =4;
printf("%d",ms.x);

因为 const 说明符只是阻止程序员在编译时修改它们。但在运行时内存不是只读的。

我仍然认为 const 说明符很有用:如果一个优秀的程序员看到它,就会说我不应该访问该字段。如果相反,想让聪明人访问这些字段并可能冒着不一致的状态的风险。
因此,如果您确定可以更改这些 const 字段,那么在您的位置我会使用这种方式。我知道迂腐的程序员不会喜欢它,我也不喜欢它,但有时我们必须绕过它。

于 2012-12-26T23:26:40.187 回答
-1

复制是万恶之源,因此您可以执行以下操作,而不是复制结构定义:

#ifndef CONST
#define CONST const
#endif

struct mystruct
{
    CONST void * my_data;
};

现在您只需CONST在私有实现中包含头文件之前定义为空。

但是,就像其他答案所暗示的那样,这不是一个好主意。首先,可能有更好、更清洁的方法来实现你想要的。其次,这可能会导致奇怪和不需要的结果,因为编译器可能会使用字段的常量来优化代码。

简而言之,我认为你最好重新考虑你的 API。

于 2012-12-26T22:54:47.243 回答