使用函数指针在struct中警告匿名命名空间

时间:2014-07-25 04:38:24

标签: 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.

我收到以下警告:

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

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

我正在Linux上编译gcc。

1 个答案:

答案 0 :(得分:4)

将类型定义放在标题中强烈建议您希望多个源文件使用该标头,并使用这些类型。

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

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

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