为什么typedef结构会产生链接失败

dav*_*pfx 16 c++ language-lawyer

所以我有一段看起来像这样的代码.

typedef struct {
  int foo;
  int bar;
  void foobar(int, char*);
} mystruct;
Run Code Online (Sandbox Code Playgroud)

void mystruct::foobar(int x, char* y) { return; }
Run Code Online (Sandbox Code Playgroud)

mystruct obj;
obj.foobar(17, "X");
Run Code Online (Sandbox Code Playgroud)

这一切都完美地编译,链接和运行.除非它没有.在一个编译器上工作,在另一个编译器(Android GCC)上它失败并出现链接错误:不满意的引用.

如果我这样改变它,它会编译和链接.

struct mystruct {
  int foo;
  int bar;
  void foobar(int, char*);
};
Run Code Online (Sandbox Code Playgroud)

我想我知道为什么,但我无法正确解释它,我无法在标准中找到它.任何人都可以向我解释并找到适当的参考吗?

编辑:我认为所有人都很清楚这是C++代码.我标记了它; struct中的函数无效C; 但只是要清楚文件有CPP扩展名,编译器将其视为C++.

编辑:一个回答者注意到调用是一个文字,因此是const,但是arg是非const的.这不是一个关键因素,因为(a)编译器传递它(b)链接失败,无论参数类型如何.

编辑:我的理论是,这与传递给链接器的匿名结构类型有关,因此单独编译的声明和调用不匹配.看起来这可能不正确,在这种情况下,它可能只是一个微妙的编译器错误.

编辑:出于好奇,有人可以重现这种行为吗?实际的编译器是Android NDK,最近的下载,以及随之而来的任何GCC版本.如果其他编译器确实/没有这个问题,那可能就是答案.

MSa*_*ers 5

我认为这是一个编译器错误。以下更极端的示例仍然可以:

typedef struct { void f(); } f;
void f::f() { }
Run Code Online (Sandbox Code Playgroud)

来自GCC错误清单。即,即使该成员函数具有与typedef相同的名称,也可以使用typedef名称来定义成员函数。