警告 struct 内的匿名命名空间使用函数指针

dop*_*ime 4 c++

在我的程序中:

//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.
Run Code Online (Sandbox Code Playgroud)

我收到以下警告:

warning: ‘_S1’ has a field ‘_S1::f1’ whose type uses the anonymous namespace [enabled by default]
 typedef struct _S1 {
            ^
Run Code Online (Sandbox Code Playgroud)

这个警告是什么意思?我的代码中出现此警告的结果是什么?如何摆脱这个警告?

我正在 Linux 上的 gcc 上编译。

小智 5

将类型定义放在头文件中这一事实强烈表明您希望多个源文件使用该头文件,并使用这些类型。

但是,如果多个源文件包含该标头,则RETVAL由于您使用的匿名结构,它们每个都会获得自己的. 但同时,_S1所有源文件的类型都相同。那是不可能的。

传统编译器不关心这一点:它们不执行整个程序的优化。更现代的编译器会这样做,它们需要能够判断两个类型定义是否真的是同一类型。为了让他们能够分辨,您的代码必须非常准确。

最简单的解决方案是为您的匿名结构命名。命名结构在所有源文件中的类型相同,指向命名结构的指针也是如此。