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

标签 c++ language-lawyer

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

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/

相关文章:

c++ - 使用花括号初始化列表 : ambiguous or not? 调用显式构造函数

c++ - OpenMP,for 循环内部部分

c++ - 在 C++ 中,如何让用户在应用程序窗口外指定屏幕上的一个点 (X,Y)?

c++ - 在template<template<class> class T1, class T2>中,<class>是什么意思?

c++ - 在基类中引用不同大小的 std::array 而不是 std::array

c++ - "deduced A"在调用类型推导的上下文中的含义

c++ - 将十六进制字符串转换为二进制并在C++中分成位

c++ - 静态成员初始化期间访问私有(private)静态函数

c++ - 如果存在非捕获局部变量,为什么不能在 Lambda 中使用非限定成员变量?

c++ - GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?