在我的一个项目中启用 lto 后,编译器开始向我抛出 lto 违规警告。经过一番测试,它归结为这个结构。
typedef struct {
typedef struct {
} test_t;
std::vector<test_t> t;
} test2_t;
一旦我将其更改为
struct test2_t {
typedef struct {
} test_t;
std::vector<test_t> t;
};
或者
typedef struct {
typedef struct {
} test_t;
test_t t;
} test2_t;
警告消失了,但我真的不明白为什么。我的猜测是它将匿名结构视为不同文件中的不同类型,但我不希望出现警告,因为它是一个常见的用例。请注意,如果我更改内部 typedef 但将外部保持在原位,这并没有什么不同。test_t 是否包含成员也无关紧要。
- 这个警告的原因是什么?
- 这种行为是预期的吗?
- 这可能是一个 STL 错误,因为它在没有矢量的情况下也能正常工作?