gpt4 book ai didi

c - 通过头文件中的 ifdef 将结构从 const 转换为非常量

转载 作者:行者123 更新时间:2023-11-30 16:23:20 25 4
gpt4 key购买 nike

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

#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 发出有关未经授权的写入访问的所有警告,第二次不使用此标志来生成编译后的目标文件,而不会因编译器优化而产生任何可能的有害副作用。

最佳答案

这是一种危险的做法,如果您在定义 ALLOW_WRITE 的源中包含使用 EXTCONST 的 header ,并且在未定义 ALLOW_WRITE 的其他源中包含 header ,则两个源将不会看到相同的定义。

因此,例如在源中,编译器可以假设某些内容不会因为 const 而改变,但因为它调用其他源中的某些内容来更改值,因此存在不一致。

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

关于c - 通过头文件中的 ifdef 将结构从 const 转换为非常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54026918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com