cảnh báo gcc "'sẽ được khởi tạo sau'


228

Tôi nhận được rất nhiều cảnh báo từ mã bên thứ 3 mà tôi không thể sửa đổi. Có cách nào để vô hiệu hóa cảnh báo này hoặc ít nhất là vô hiệu hóa nó cho một số khu vực nhất định (như #pragma đẩy / pop trong VC ++) không?

Thí dụ:

list.h:1122: warning: `list<LogOutput*, allocator<LogOutput*> >::node_alloc_' will be initialized after 
list.h:1117: warning:   `allocator<LogOutput*> list<LogOutput*, allocator<LogOutput*> >::alloc_'

Bạn có thể vui lòng gửi một vài dòng cảnh báo thực tế? Và cũng cho biết nếu đây là C, C ++ và nếu bạn có nguồn, nếu cảnh báo đến từ trình liên kết hoặc quá trình biên dịch?
csl

Câu trả lời:


371

Hãy chắc chắn rằng các thành viên xuất hiện trong danh sách khởi tạo theo thứ tự giống như chúng xuất hiện trong lớp

Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

hoặc bạn có thể biến -Wno-reorder


91
Tại sao btw quan trọng này? Tại sao cảnh báo này tồn tại?
Eloff

40
@Eloff Trong một số trường hợp (không khuyến nghị) bvà việc akhởi tạo có thể phụ thuộc vào nhau. Một người dùng ngây thơ có thể cố gắng thay đổi thứ tự khởi tạo để có được một số hiệu ứng và Cảnh báo sẽ làm rõ rằng nó không hoạt động.
Gorpik

24
Vậy thứ tự khai báo có ý nghĩa ngữ nghĩa, ngay cả khi không có mối quan hệ nào giữa các khai báo? Thật vô nghĩa!
Cuadue

10
Điều này không giải thích tại sao cảnh báo này tồn tại và trích dẫn -Wno-reordermà không đề cập đến những vấn đề có thể dẫn đến. Tôi biết rằng OP đã không hỏi bất kỳ chi tiết nào khác, nhưng một câu trả lời được đánh giá cao như vậy tôi mong đợi ít nhất là đề cập đến bối cảnh và cảnh báo xung quanh vấn đề này. Không phải chúng ta nên trả lời câu hỏi mà OP nên viết sao?
gạch dưới

4
@ cp.engr thành viên được khởi tạo theo thứ tự khai báo, không phải thứ tự của họ trong danh sách init - vì vậy, nếu việc khởi tạo của thành viên phụ thuộc vào người khác, nhưng các khai báo bị hoán đổi để người phụ thuộc được khởi tạo sau khi phụ thuộc, ai đó sẽ có một thời gian rất tồi tệ rất sớm, vì đó là UB thuần túy.
underscore_d


17

Đối với những người sử dụng QT có lỗi này, hãy thêm nó vào tệp .pro

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder

7

sử dụng -Wno-reorder(người đàn ông gcc là bạn của bạn :))


6
Ồ, bạn đã tìm thấy một cách mới để nói RT_M: MIYF (người đàn ông là bạn của bạn) Nếu bạn không phiền, tôi sẽ sử dụng nó :)
Oren S

4

Nếu bạn thấy lỗi từ các tiêu đề thư viện và bạn đang sử dụng GCC, thì bạn có thể vô hiệu hóa các cảnh báo bằng cách bao gồm các tiêu đề sử dụng -isystemthay vì -I.

Các tính năng tương tự tồn tại trong tiếng kêu .

Nếu bạn đang sử dụng CMake, bạn có thể chỉ định SYSTEMcho include_directories.


Bạn có thể giải thích làm thế nào để "chỉ định SYSTEM"?
einpoklum

1
Chỉ cần đặt chuỗi `HỆ THỐNG 'ở cuối include_directoriesdòng.
Drew Noakes

1

Thứ tự khởi tạo không thành vấn đề. Tất cả các trường được khởi tạo theo thứ tự định nghĩa của chúng trong lớp / struct của chúng. Nhưng nếu thứ tự trong danh sách khởi tạo là gcc / g ++ khác nhau sẽ tạo ra cảnh báo này. Chỉ thay đổi thứ tự khởi tạo để tránh cảnh báo này. Nhưng bạn không thể xác định trường sử dụng trong khởi tạo trước khi xây dựng nó. Nó sẽ là một lỗi thời gian chạy. Vì vậy, bạn thay đổi thứ tự của định nghĩa. Hãy cẩn thận và giữ sự chú ý!


OP muốn biết cách vô hiệu hóa cảnh báo, không phải ý nghĩa của nó hay cách sửa mã. Trong thực tế, bài đăng nói rằng mã là bên thứ ba và không thể sửa đổi. Họ không thể thay đổi thứ tự định nghĩa và có lẽ cũng không phải là thứ tự khởi tạo.
Tim Seguine

sẽ rất vấn đề nếu đối tượng thứ 2 trong danh sách init là initd từ đối tượng thứ 1, nhưng chúng bị khai báo sai cách xung quanh trong tiêu đề. trong trường hợp đó, mọi thứ có thể trở nên rất kỳ lạ.
gạch dưới

0
Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

thứ tự là quan trọng bởi vì nếu a được khởi tạo trước b và a phụ thuộc vào b. hành vi không xác định sẽ xuất hiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.