我想使结构成员对所有人都可访问,但仅对特殊标记的代码可写。 在头文件中使用以下内容:
#ifdef ALLOW_WRITE
#define EXTCONST
#else
#define EXTCONST const
#endif
并将EXTCONST放置在这样的struct typedef中:
typedef struct {
int a;
} EXTCONST typename;
对应的.c文件开头具有#define ALLOW_WRITE,其他文件则没有。
我几乎可以确定,至少在不启用积极性优化的情况下,它可以按预期工作。 两个问题:
1)在启用最大优化后,此功能是否可以正常工作?
2)按照C标准这种方法正确吗?
注意:我知道这可以通过getter函数完成,但是我认为st-> a-> b看起来比a_get_b(st_get_a(st))更好,更直观
摘要: 至少有两个人说这种隐藏的类型转换是不安全的,没有人说可以。
因此,我将使用“改进的”方式进行只读访问检查。
#ifdef CONST_CHECK
#ifdef ALLOW_WRITE
#define EXTCONST
#else
#define EXTCONST const
#endif
#else
#define EXTCONST
#endif
然后对有问题的源文件运行两次编译器:一次使用-DCONST_CHECK发出关于未授权写访问的所有警告,第二次使用此标志来生成编译的目标文件,而不会受到编译器优化的任何有害影响。< / p>
答案 0 :(得分:0)
这是一种危险的方式,如果在定义ALLOW_WRITE的源中包括使用EXTCONST的标头,并且在未定义ALLOW_WRITE的其他源中包括这两个源,则两个源将看不到相同的定义。
因此,例如,在源代码中,编译器可以假设由于const不会更改某些内容,但是由于它在其他源代码中调用某些内容来更改值,因此存在不一致之处。
所有源必须共享相同的定义。