C修改结构中的const成员

时间:2012-12-26 22:44:20

标签: c casting struct const

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

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

3 个答案:

答案 0 :(得分:5)

使用opaque structs and accessor functions

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

API中的访问者功能提供您喜欢的任何受控访问。

答案 1 :(得分:0)

这里只是注意:这些字段并非真的不可写 你想让它们变得“私密”,但每个程序员都可以这样访问它们:

typedef struct
{
    const int x;
}mystruct;

然后:

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

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

我仍然认为const说明符是有用的:如果一个优秀的程序员看到它,那么说我不应该访问该字段。如果想要让智能人员访问字段并且可能存在不一致状态的风险。 /> 因此,如果你确定这些const字段可以改变,在你的地方,我会用这种方式。我知道迂腐的程序员不会喜欢它,我也不喜欢它,但有时我们必须绕过它。

答案 2 :(得分:-1)

复制是万恶之源,所以不要复制结构定义,你可以这样做:

#ifndef CONST
#define CONST const
#endif

struct mystruct
{
    CONST void * my_data;
};

现在,您只需将CONST定义为空,然后再将头文件包含在私有实现中。

然而,正如其他答案所表明的那样,这不是一个好主意。首先,可能有更好,更清洁的方式来实现你想要的东西。其次,这可能会导致奇怪和不需要的结果,因为编译器可能会使用字段的常量来优化代码。

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