这是否适用于void*指针?如果没有,怎么样?

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"结构中的相应值.

unw*_*ind 6

不,这不起作用.类型的指针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)

它整齐地封装了默认值,并删除了全局.