Предупреждение Анонимное пространство имен внутри структуры с использованием указателя на функцию

В моей программе:

//Put this code in a separate header file.
struct _S1;
typedef struct {int unused;} * RETVAL;

typedef RETVAL (*MyFunc) (void* result, void* ctx, struct _P1* s);
typedef struct _S1 {
    struct _S1 *parent;
    MyFunc f1;
} S1;

//In cpp file, include the above header file.

Я получаю следующее предупреждение:

warning: ‘_S1’ has a field ‘_S1::f1’ whose type uses the anonymous namespace [enabled by default]
 typedef struct _S1 {
            ^

В чем смысл этого предупреждения? Каков результат этого предупреждения в моем коде? Как избавиться от этого предупреждения?

Я собираю на GCC на Linux.

1 ответ

Решение

Тот факт, что вы помещаете определения типов в заголовок, настоятельно предполагает, что вы хотите, чтобы несколько исходных файлов использовали этот заголовок и использовали эти типы.

Но если несколько исходных файлов включают этот заголовок, каждый из них получает свою собственную версию RETVALиз-за анонимной структуры, которую вы используете. И в то же время _S1 будет одинаковым типом для всех исходных файлов. Это невозможно.

Традиционные компиляторы не заботятся об этом: они не выполняют оптимизацию всей программы. Это делают более современные компиляторы, и они должны быть в состоянии определить, действительно ли два определения типов одного типа. Чтобы они могли сказать, ваш код должен быть очень точным.

Самое простое решение - дать вашей анонимной структуре имя. Именованная структура имеет одинаковый тип во всех исходных файлах, как и указатель на именованную структуру.

Другие вопросы по тегам