3

在我的一个项目中启用 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 错误,因为它在没有矢量的情况下也能正常工作?
4

0 回答 0