gcc: исправление -педантичного предупреждения "безымянная структура"

Я пытаюсь получить некоторый код из другого места (в частности, здесь), чтобы скомпилировать без каких-либо предупреждений, когда gcc получает -pedantic флаг. Единственная проблема - это немного кода:

struct __attribute__ ((aligned(NLMSG_ALIGNTO))) {
    struct nlmsghdr nl_hdr;
    /* Unnamed struct start. */
    struct __attribute__ ((__packed__)) {
        struct cn_msg cn_msg;
        struct proc_event proc_ev;
    };
    /* Unnamed struct end. */
} nlcn_msg;

Независимо от того, где я пытаюсь ввести имя для структуры, это приводит к ошибке компиляции. Есть ли способ изменить данный код, чтобы удовлетворить -pedantic? Или есть какой-то способ сказать gcc не выдавать предупреждение только для этого куска кода?

1 ответ

Решение

Какой стандарт вы компилируете?

Учитывая этот код:

#define NLMSG_ALIGNTO 4

struct nlmsghdr { int x; };
struct cn_msg { int x; };
struct proc_event { int x; };

struct __attribute__ ((aligned(NLMSG_ALIGNTO))) {
    struct nlmsghdr nl_hdr;
    /* Unnamed struct start. */
    struct __attribute__ ((__packed__)) {
        struct cn_msg cn_msg;
        struct proc_event proc_ev;
    };
    /* Unnamed struct end. */
} nlcn_msg;

Компиляция с режимом C99, я получаю ошибки:

$ gcc -O3 -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
    -Wold-style-definition -Werror -pedantic -c x2.c
x2.c:13:6: error: ISO C99 doesn’t support unnamed structs/unions [-Werror=pedantic]
     };
      ^
cc1: all warnings being treated as errors
$

Компилируя с режимом C11, я не получаю ошибок:

$ gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
      -Wold-style-definition -Werror -pedantic -c x2.c
$
Другие вопросы по тегам