gpt4 book ai didi

c++ - 为什么 typedef struct 会产生链接失败

转载 作者:IT老高 更新时间:2023-10-28 22:21:51 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com