【发布时间】:2012-09-19 06:34:34
【问题描述】:
在 Foo.h 中:
class Foo
{
public:
Foo();
static const unsigned int FOOBAR = 10;
static const unsigned int BARFOO = 20;
private:
unsigned int m_FooBar;
bool m_Bar;
void Bar();
};
在 Foo.cpp 中:
Foo::Foo()
: m_FooBar(FOOBAR), // this works
m_Bar(false)
{
}
void Foo::Bar()
{
//m_FooBar = m_Bar ? FOOBAR : BARFOO; // linker fails *1
m_FooBar = FOOBAR; // ok
}
我正在使用 GCC 4.5.3 进行编译。取消注释 *1 行时,链接器是否会失败?
Foo.o: In function 'Foo::Bar' (name unmangled):
Foo.cpp: undefined reference to `Foo::FOOBAR'
Foo.cpp: undefined reference to `Foo::BARFOO'
已尝试使用 VC2005、2008、2010 和 CB2010。他们都编译和链接得很好。为什么 GCC 在这种情况下会失败?
鉴于answer here,为什么其他流行的编译器没有像 GCC 一样失败?无论是对于 GCC 还是其他流行的编译器,它都必须是一个错误。还是有更合理的解释?
【问题讨论】:
-
嗯...在VS2010中编译得很好。
-
@Mysticial 问题是关于 gcc 的。我可以确认链接器错误。
-
已经提交as a bug。
-
@ZachSaw:从技术上讲,你是对的。根据 ISO C++11 标准,这不是一个错误,因为直到 2012 年 2 月标准被批准后,对标准的更改才被投票纳入工作文件。但是,由于委员会确定这是当前标准中的缺陷,因此将其作为错误提交,以确保任何未来版本的 gcc 都表现出所需的行为(并且因为未来的标准将进行这些更正)。