Joh*_*n U 0 c embedded pointers void void-pointers
在我们的代码中,我们有一个混合类型的大结构,并希望为这些存储默认值的重复(const)结构.
当用户想要默认设置时,能够通过在结构中获取项的地址偏移量来实现这一点,然后在"defaults"结构中分配具有相同偏移量的值,这样会很好像这样:
void *setting = &settings->thing; // Points to a setting
int offset = setting - &settings;
void *default = &defaults_struct + offset; // Points to the default value
*setting = *default; // Set setting to default value
Run Code Online (Sandbox Code Playgroud)
想法是如果settings-> thing指向int8,则从默认值复制int8值,但如果settings-> other_thing是int32,则复制完整的32位.
问题是,如上所述,这是否适用于无效指针?如果没有,有没有办法做到这一点?我错过了更好的实现方法吗?
编辑澄清:我们希望在结构中将单个值设置为"defaults"结构中的相应值.
不,这不起作用.类型的指针void *没有与它们相关的大小,即它们指向的数据类型是未知的.因此,你不能做那样的任务.
您可能应该直接从默认值中复制,如评论中所建议的那样.
另请注意,这default是C中的保留字,因此不应将其用于变量.
如果默认值是全局可见的,您可以定义一个宏来隐藏它:
#define INITIALIZE(s, f) s. f = default_struct. f
Run Code Online (Sandbox Code Playgroud)
用户(我假设是开发人员)现在可以:
struct settings s;
INITIALIZE(s, thing);
Run Code Online (Sandbox Code Playgroud)
也就是说,我(作为开发人员)喜欢这样的东西:
struct settings s = get_default_settings();
Run Code Online (Sandbox Code Playgroud)
这更清晰,更少魔力.当然,复制所有字段可能需要更多时间,但设置通常不是性能关键.
请注意,上述功能可能只是:
struct settings get_default_settings(void)
{
static const struct settings the_defaults = {/* the default values go here*/};
return the_defaults;
}
Run Code Online (Sandbox Code Playgroud)
它整齐地封装了默认值,并删除了全局.
| 归档时间: |
|
| 查看次数: |
434 次 |
| 最近记录: |