typedef声明定义未命名类时链接失败

Link failure when typedef declaration defines unnamed class

本文关键字:链接 失败 未命名 声明 定义 typedef      更新时间:2023-10-16

C++11标准的7.1.3[9]节规定:

如果typedef声明定义了一个未命名的类(或枚举),则声明声明为该类类型(或枚举类型)的第一个typedef名称用于表示仅用于链接目的的类类型(或者枚举类型)(3.5)

[示例:

typedef struct { } *ps, S; // S is the class name for linkage purposes

-结束示例]

这意味着在下面的示例中,Foo应该用作未命名类的名称,并在下面的例子中用于链接目的:

//foo1.cpp
typedef class
{
        public: int f();
} Foo;
int Foo::f()
{
        return 5;
}

由于Foo::f()是在foo1.cpp中定义的,编译器不应该抱怨。

//foo2.cpp
typedef class
{
    public: int f();
} Foo;
Foo foo;
int main()
{
    return foo.f();
}

但是,GCC 4.8出现链接错误。我是不是错过了什么?

$g++ foo1.cpp foo2.cpp
/tmp/ccMwHawT.o: In function `main':
713Y51.cpp:(.text+0x24): undefined reference to `Foo::f()'
collect2: error: ld returned 1 exit status

我认为你是对的。除了你的问题之外,标准中没有什么可以补充的。

这是GCC中一个长期存在的错误。clang同意你的解释并接受你的计划。