我正在设计一个API,它的关键部分是API返回的结构,包含许多const成员。此外,还有const指针和指向const变量的指针。在实现中,我需要修改这个结构。目前,我已经定义了完全相同的结构,但使用了删除的const关键字和不同的名称。在API调用中,我只是将外部结构转换为内部结构。
有没有办法以更好的方式编码?如果我修改一个结构而忘记另一个结构,那么当前的设计容易出错。
答案 0 :(得分:5)
答案 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。