Предупреждение Анонимное пространство имен внутри структуры с использованием указателя на функцию
В моей программе:
//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
будет одинаковым типом для всех исходных файлов. Это невозможно.
Традиционные компиляторы не заботятся об этом: они не выполняют оптимизацию всей программы. Это делают более современные компиляторы, и они должны быть в состоянии определить, действительно ли два определения типов одного типа. Чтобы они могли сказать, ваш код должен быть очень точным.
Самое простое решение - дать вашей анонимной структуре имя. Именованная структура имеет одинаковый тип во всех исходных файлах, как и указатель на именованную структуру.