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版本.如果其他编译器确实/没有这个问题,那可能就是答案.
我认为这是一个编译器错误。以下更极端的示例仍然可以:
typedef struct { void f(); } f;
void f::f() { }
Run Code Online (Sandbox Code Playgroud)
来自GCC错误清单。即,即使该成员函数具有与typedef相同的名称,也可以使用typedef名称来定义成员函数。