2009-10-14 24 views
173

Tôi nhận được nhiều cảnh báo này 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 vô hiệu hóa cảnh báo đó cho một số khu vực nhất định (như #pragma) push/pop trong VC++)Cảnh báo gcc "'sẽ được khởi chạy sau'

Ví 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_' 
+0

Bạn có thể đăng một vài dòng cảnh báo thực tế không? 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

Trả lời

277

Hãy chắc chắn rằng các thành viên xuất hiện trong danh sách initializer theo thứ tự 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

+10

OP không thể sửa đổi mã. –

+64

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

+30

@Eloff Trong một số trường hợp (không khuyến khích), 'b' và' a' khởi tạo có thể phụ thuộc lẫn 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 cho nó rõ ràng rằng nó không hoạt động. – Gorpik

28

bạn có thể vô hiệu hóa nó với -Wno-reorder

7

sử dụng -Wno-reorder (con người là gcc cho bạn bè :))

+5

Wow, 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 nhớ, tôi sẽ sử dụng nó :) –

12

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

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder 
1

Thứ tự khởi tạo không quan trọng. 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/cấu trúc của chúng. Nhưng nếu thứ tự trong danh sách khởi tạo là gcc/g ++ khác nhau 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 bằng cách sử dụng trong khởi tạo trước khi xây dựng của 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ú ý!

+0

OP muốn biết cách tắt cảnh báo, không phải ý nghĩa của nó hoặc cách sửa mã. Trên thực tế, bài đăng cho biết mã là bên thứ ba và không thể sửa đổi được. Họ không thể thay đổi thứ tự của định nghĩa và có lẽ cũng không phải thứ tự khởi tạo. –

+0

nó rất nhiều ** không ** vấn đề nếu đối tượng thứ 2 trong danh sách init là initd từ đối tượng thứ nhất, nhưng chúng được 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 lạ. –

4

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

Tính năng tương tự tồn tại trong clang.

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

+0

Bạn có thể giải thích cách "chỉ định' SYSTEM' "không? – einpoklum

+1

Chỉ cần đặt chuỗi 'SYSTEM' ở cuối dòng' include_directories'. –

Các vấn đề liên quan