c-通过头文件中的ifdefs将结构从const非直接类型转换为non-const



我想让结构成员对所有人都可访问,但只对特殊标记的代码可写。在头文件中使用类似的东西:

#ifdef ALLOW_WRITE
#define EXTCONST
#else
#define EXTCONST const
#endif

并将EXTCONST放在结构typedefs的各处,如下所示:

typedef struct {
int a;
} EXTCONST typename;

相应的.c文件一开始有#define ALLOW_WRITE,其他文件没有。

我几乎可以肯定,这将如预期的那样工作,至少在没有启用激进优化的情况下。两个问题:

1) 在启用最大优化的情况下,这能正常工作吗?

2) 根据C标准,这种方式正确吗?

注意:我知道这可以通过getter函数来完成,但我认为st->a->b看起来比a_get_b(st_get_a(st))更好、更直观

摘要:至少有两个人说这种隐藏的打字不安全,也没有人说可以

所以我将使用"改进"的方法来进行读取noly访问检查。

#ifdef CONST_CHECK
#ifdef ALLOW_WRITE
#define EXTCONST
#else
#define EXTCONST const
#endif
#else
#define EXTCONST
#endif

并对有问题的源文件运行编译器两次:一次使用-DCONST_CHECK发出关于未经授权的写访问的所有警告,另一次不使用此标志生成编译后的对象文件,而不会受到编译器优化的任何可能的有害副作用。

这是一种危险的方法,如果在定义ALLOW_WRITE的源中包含使用EXTCONST的标头,并且在没有定义ALLOW-WRITE的其他源中包含此标头,则两个源将看不到相同的定义。

例如,在一个源中,编译器可以假设某个东西不会因为const而改变,但因为它调用了另一个源的某个东西来改变值,所以存在不一致性。

所有来源必须共享相同的定义。

相关内容

最新更新