我有以下代码(为简单起见,省略了包含守卫):
= foo.hpp
=
struct FOO
{
int not_used_in_this_sample;
int not_used_in_this_sample2;
};
= main.cpp
=
#include "foo_generator.hpp"
#include "foo.hpp"
int main()
{
FOO foo = FooGenerator::createFoo(0xDEADBEEF, 0x12345678);
return 0;
}
= foo_generator.hpp
=
struct FOO; // FOO is only forward-declared
class FooGenerator
{
public:
// Note: we return a FOO, not a FOO&
static FOO createFoo(size_t a, size_t b);
};
= foo_generator.cpp
=
#include "foo_generator.hpp"
#include "foo.hpp"
FOO FooGenerator::createFoo(size_t a, size_t b)
{
std::cout << std::hex << a << ", " << b << std::endl;
return FOO();
}
就目前而言,这段代码编译得非常好,没有任何警告。如果我的理解是正确的,它应该输出:
deadbeef, 12345678
但相反,它随机显示:
12345678, 32fb23a1
或者只是崩溃。
如果我用 替换 FOO 的前向声明foo_generator.hpp
,#include "foo.hpp"
那么它可以工作。
所以这是我的问题:返回一个前向声明的结构会导致未定义的行为吗?或者什么可能出错?
使用的编译器:MSVC 9.0 和 10.0(都显示问题)