在我的一个项目中启用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是否包含成员也无关紧要。