2010-11-14 23 views
8

Có Q_OBSOLETE hoặc Q_DEPRECATED trong C++ với Qt 4.7 không?Làm thế nào để đánh dấu một cái gì đó trong Qt là lỗi thời (không được chấp nhận)?

Hoặc có macro hoặc từ khóa C++ tương tự?

+0

Những gì bạn muốn như vậy một macro hoặc từ khóa để làm gì? – bjoernz

+1

Để đưa ra cảnh báo nếu các cấu trúc không được sử dụng được tìm thấy trong sử dụng. Xem http://en.wikipedia.org/wiki/Deprecation để có giải thích tốt hơn. –

Trả lời

-2

Bằng "cấu trúc không được chấp nhận", bạn thực sự có nghĩa là "chức năng thành viên không dùng nữa". Bạn đang yêu cầu một cảnh báo biên dịch thời gian để thu hút sự chú ý của bạn đến trang web gọi của bất kỳ chức năng không được chấp nhận nào.

Điều này là không thể theo bất kỳ cách nào hợp lý trong tiêu chuẩn C++ và tôi không thấy bất kỳ thuộc tính nào trong G ++ cũng hỗ trợ điều này. Qt không thể thực sự thêm một tính năng như vậy nếu trình biên dịch không có một số hỗ trợ cho nó rồi.

Tuy nhiên, Microsoft Visual C++ hỗ trợ phần mở rộng __declspec(deprecated) và tôi có thể tưởng tượng có thể viết một trình biên dịch plugin cho G ++ 4.5 có thêm tính năng tương tự.

+0

Có vẻ như tôi đã bỏ lỡ '__attribute __ ((không được chấp nhận))' trong G ++. –

0

Bạn có thể muốn làm điều gì đó tương tự bản thân:

#ifdef Q_TREAT_OBSOLETE_AS_ERRORS 
#define Q_OBSOLETE(X) \ 
     BOOST_STATIC_ASSERT(false); \ 
     X 

#else 
#define Q_OBSOLETE(X) X 
#endif 

xây dựng này chỉ đơn giản là thay thế một số mã NỮA/một phần của mã nếu không có Q_TREAT_OBSOLETE_AS_ERRORS xác định và tạo ra lỗi biên dịch-thời gian khác.

Lưu ý rằng BOOST_STATIC_ASSERT không có giới hạn phạm vi, do đó, macro Q_OBSOLETE.

Có lẽ đây không phải là cách tốt nhất để giải quyết vấn đề của bạn và thực sự tôi không chắc chắn điều này hữu ích.

Bạn có thể chỉ cần đánh dấu mã là @obsolete hoặc chỉ đơn giản là chỉ ra trong các nhận xét.

+0

Điều này không hoạt động. Điều này sẽ gây ra lỗi biên dịch nếu mã không được chấp nhận được ** biên dịch **, cho dù mã đó có được gọi từ một nơi nào khác hay không. –

+0

@Ken Vâng, rõ ràng là bạn không có cách nào để kiểm tra xem một số đoạn mã có thực sự được gọi hay không. Điều xác nhận tĩnh này đơn giản giúp thu hút sự chú ý đến việc biên soạn các tính năng không được chấp nhận. * Trên thực tế, tất cả các công cụ Q_OBSOLETE này có vẻ khá không cần thiết đối với tôi.* –

+0

anh ấy hỏi (tôi nghĩ) bởi vì anh ấy đã quen với Java, có thể chú thích các chức năng như không được chấp nhận và cung cấp cho bạn cảnh báo trình biên dịch khi bạn cố gắng sử dụng chúng. –

1

Chỉ cần sử dụng chỉ thị

#warning 

mặc dù không phải là C++ chuẩn là khá khó xảy ra, bạn sẽ gặp phải một trình biên dịch mà không hỗ trợ nó (see this SO question).

+0

Windows/MSVC là một mục tiêu khá phổ biến với Qt, vì vậy tôi phải không đồng ý với "khá khó xảy ra". –

1
  1. Kéo chức năng thực ra khỏi phạm vi công khai.
  2. Tạo một hàm khác có cùng tên trong phạm vi công khai.
  3. Chèn mã cảnh báo/lỗi của bạn vào hàm đó.
  4. Gọi bản gốc bằng hình mới.
+2

Không thể phát ra cảnh báo thời gian biên dịch theo cách đó. –

31

Nếu bạn sử dụng Q_DECL_DEPRECATED bạn sẽ nhận được kết quả bạn đang tìm kiếm ví dụ .:

Q_DECL_DEPRECATED void foo(); 
+6

đây phải là câu trả lời được chấp nhận. – dom0

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