警告使用函数指针的结构内部的匿名命名空间

2024-03-25

在我的程序中:

//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 {
            ^

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

我在 Linux 上使用 gcc 进行编译。


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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

警告使用函数指针的结构内部的匿名命名空间 的相关文章

随机推荐