Я создал следующую структуру:Предупреждения для заполнения структуры в Clang
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 },
};
Но когда я компилирую с лязгом -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' с 7 байтами до align 'fct' [-Wpadded] – Xwilarg
Это предупреждение можно безопасно игнорировать и подавлять. Структуры заполнения - это совершенно правильная вещь, которую компилятор часто делает. Если вы не полагаетесь на конкретный макет, конечно, что нехорошо делать. –