所以我有一段看起来像这样的代码。
typedef struct {
int foo;
int bar;
void foobar(int, char*);
} mystruct;
和
void mystruct::foobar(int x, char* y) { return; }
和
mystruct obj;
obj.foobar(17, "X");
这一切都可以完美地编译、链接和运行。除非它没有。在一个编译器上它可以工作,而在另一个编译器(Android GCC)上它失败并出现链接错误:不满意的引用。
如果我这样更改它,它会编译并链接。
struct mystruct {
int foo;
int bar;
void foobar(int, char*);
};
我想我知道为什么,但我无法正确解释,也无法在标准中找到它。谁能给我解释一下并找到合适的引用?
编辑:我认为所有相关人员都很明显这是 C++ 代码。我标记了它;结构中的函数无效 C;但为了清楚起见,该文件具有 CPP 扩展名,编译器将其视为 C++。
编辑:回答者注意到调用是文字,因此是 const,但 arg 是非常量。这不是一个关键因素,因为 (a) 编译器传递了它 (b) 无论参数类型如何,链接都会失败。
编辑:我的理论是这与传递给链接器的匿名结构类型有关,因此单独编译的声明和调用不匹配。看起来这可能不正确,在这种情况下,它可能只是一个微妙的编译器错误。
编辑:出于好奇,任何人都可以重现这种行为吗?实际的编译器是最近下载的 Android NDK,以及附带的任何版本的 GCC。如果其他编译器有/没有这个问题,那可能就是答案。
最佳答案
我认为这是一个编译器错误。下面更极端的例子还是可以的:
typedef struct { void f(); } f;
void f::f() { }
来自 GCC buglist . IE。您可以使用 typedef 名称来定义成员函数,即使该成员函数与 typedef 具有相同的名称。
关于c++ - 为什么 typedef struct 会产生链接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21550425/