【发布时间】:2016-11-18 06:20:31
【问题描述】:
我创建了以下结构:
typedef struct s_fct_printf
{
char flag;
void (*fct)(void*);
} t_fct_printf;
static const t_fct_printf flags[] =
{
{ 's', my_putstr_printf },
//[...]
{ 'b', display_base_2 },
};
但是当我用 clang -Weverything 编译时,我有以下警告:
warning: padding struct 'struct s_fct_printf' with 7 bytes to
align 'fct' [-Wpadded]
我找到了以下解决方案:
typedef struct s_fct_printf
{
char flag;
void (*fct)(void*);
char pad[7];
} t_fct_printf;
但这并没有解决问题:
warning: missing field 'pad' initializer [-Wmissing-field-initializers]
{ 'b', display_base_2 },
warning: padding struct 'struct s_fct_printf' with 7 bytes to
align 'fct' [-Wpadded]
所以我尝试了:
typedef struct s_fct_printf
{
char flag;
char pad[7];
void (*fct)(void*);
} t_fct_printf;
但出现以下错误:
warning: incompatible pointer to integer conversion initializing 'char'
with an expression of type 'void (void *)' [-Wint-conversion]
{ 'b', display_base_2 },
warning: suggest braces around initialization of subobject
[-Wmissing-braces]
{ 'b', display_base_2 },
warning: missing field 'fct' initializer [-Wmissing-field-initializers]
{ 'b', display_base_2 },
error: initializer element is not a compile-time constant
{ 's', my_putstr_printf },
我找到的最后一个解决方案是,但我读到它没有优化,因为编译器不再打包我的变量。
typedef struct __atribute__((__packed__)) s_fct_printf
{
char flag;
void (*fct)(void*);
} t_fct_printf;
有好的解决办法吗?
【问题讨论】:
-
你还没有说明问题...
-
好吧,我的问题是,当我用 clang 编译时,我有这个警告:padding struct 'struct s_fct_printf' with 7 bytes to align 'fct' [-Wpadded]
-
可以安全地忽略和抑制此警告。填充结构是编译器经常做的完全有效的事情。除非你依赖于特定的布局,当然,这不是一件好事..
-
您应该禁用填充警告;它对正常的程序代码没有用。阅读大量警告选项并添加所需的选项可能是一种更好的方法。这样你也知道它们的意思(如果你读过文档,你会发现的,顺便说一句)。