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

时间:2019-01-03 17:19:17

标签: c struct casting const

我想使结构成员对所有人都可访问,但仅对特殊标记的代码可写。 在头文件中使用以下内容:

#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>

1 个答案:

答案 0 :(得分:0)

这是一种危险的方式,如果在定义ALLOW_WRITE的源中包括使用EXTCONST的标头,并且在未定义ALLOW_WRITE的其他源中包括这两个源,则两个源将看不到相同的定义。

因此,例如,在源代码中,编译器可以假设由于const不会更改某些内容,但是由于它在其他源代码中调用某些内容来更改值,因此存在不一致之处。

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