2011-07-02 44 views
19

Tôi biết cách vô hiệu hóa tất cả cảnh báo #pragma không xác định. Câu trả lời đã được đưa ra, ví dụ, ở đây: SO: How to disable #pragma warnings?Cách tắt cảnh báo #pragma không xác định cụ thể? (GCC và/hoặc clang)

Câu hỏi của tôi là - có cách nào để vô hiệu hóa cảnh báo 'pragma' không xác định cho một pragma cụ thể không? Ví dụ, nếu tôi vô hiệu hóa cảnh báo cho #pragma ugubugu đoạn mã sau:

#pragma ugubugu 
#pragma untiunti 
int main() {return 0;} 

khi biên soạn với một trong hai:

g++ pragma.cpp -Wall 
clang++ pragma.cpp -Wall 

nên tạo ra một cảnh báo duy nhất:

warning: ignoring #pragma untiunti 

Có lẽ, ví dụ, có một cách đơn giản để đăng ký một pragma tùy chỉnh mà sẽ không làm gì?

Sẽ thật tuyệt vời khi biết liệu có một tùy chọn như vậy là Visual Studio hay không, nhưng điều đó ít quan trọng hơn.

Cảm ơn bạn!


"nhưng tại sao cuối cùng anh ấy chơi với pragmas tùy chỉnh?"

Nguồn của tôi được phân tích bởi hai trình biên dịch. Trong một trong số đó, có một số đặc biệt là #pragma. Tất nhiên, tôi có thể đặt #ifdef COMPILER_IDENTIFICATION_MACRO ... #endif xung quanh mọi trường hợp của #pragma nhưng điều đó sẽ rất cồng kềnh.

Trả lời

13

Tôi chắc chắn rằng không có cách nào để thực hiện việc này.

Cả GCC và Clang làm có giao diện nội bộ cho phép các lối vào ngôn ngữ để đăng ký #pragma xử lý với Preprocessor - xem GCC của libcpp/directives.c và Clang của lib/Lex/Pragma.cpp - nhưng, như xa như tôi có thể nhìn thấy, không có gì cho phép bạn chỉnh sửa là được xử lý được đăng ký (ngoài những gì được ngụ ý bởi biến thể ngôn ngữ bạn đang biên dịch) dựa trên các tùy chọn dòng lệnh.

Tôi biết cách vô hiệu hóa tất cả cảnh báo #pragma không xác định. Câu trả lời đã được đưa ra, ví dụ: tại đây: SO: How to disable #pragma warnings?

Lưu ý rằng câu trả lời bình chọn cao nhất là tốt hơn câu trả lời được chấp nhận ở đó. Bạn chỉ có thể thêm -Wno-unknown-pragmas trên dòng lệnh sau mọi thứ (như -Wall) sẽ bật cảnh báo.

Nguồn của tôi được phân tích bởi hai trình biên dịch. Trong một trong số đó, có một số đặc biệt là #pragma. Tất nhiên, tôi có thể đặt #ifdef COMPILER_IDENTIFICATION_MACRO ... #endif xung quanh mọi trường hợp của #pragma nhưng điều đó sẽ rất cồng kềnh.

Từ quan điểm phi lý hơn, tôi nghĩ đây thực sự là giải pháp đúng, cồng kềnh dù có thể!

Có vẻ như chính xác với tôi để ẩn bất kỳ #pragma từ trình biên dịch mà dự kiến ​​sẽ không hiểu nó theo cách bạn dự định, cho rằng toàn bộ điểm của #pragma là cung cấp cơ chế để gọi hành vi được thực hiện được xác định trong trình biên dịch.

(Nếu bạn kết thúc làm điều này, lưu ý rằng Clang định nghĩa __clang__, nhưng cả GCC và Clang xác định __GNUC__.)

+0

Cho rằng không ai đi kèm với một giải pháp tốt hơn, tôi phải chấp nhận một câu nói rằng "bây giờ có cách để làm điều đó" - đó là - của bạn. Ngoài ra, các con trỏ đến trình biên dịch internals có thể hữu ích nếu tôi quyết định nhảy sâu hơn vào nó. Cảm ơn bạn! – CygnusX1

+0

Và không ai biết cách ngăn chặn các cảnh báo trong mã? Khi tôi gửi nó đi đến một thế hệ dự án tự động mà tôi không có quyền kiểm soát. Nó được xây dựng với đầy đủ cảnh báo. – Dan

+1

#pragma GCC chẩn đoán đẩy #pragma GCC chẩn đoán bị bỏ qua "-Wunknown-pragmas" ... Mã sử ​​dụng pragmas không xác định ... #pragma GCC chẩn đoán đẩy – Dan

-2
  • Trình biên dịch không cho phép pragmas tùy chỉnh vì pragmas (chủ yếu) là trình biên dịch và/hoặc trình kiểm soát liên kết. Vì điều này rất gần với một trình biên dịch và các tính năng cụ thể, nên ứng dụng "xác định pragmas mới" cho người dùng là gì? Trong thực tế, những chỉ thị pragma có sẵn được thực hiện trên một trình biên dịch cụ thể là hoàn toàn độc lập với nhà cung cấp (không có quy tắc standarization C++).
  • Có thể bạn muốn sử dụng pragmas để đánh dấu các phần đặc biệt của mã của bạn (ví dụ: để nạp tiền xử lý của riêng bạn) vì bạn đang yêu cầu chỉ thị no-op. Điều này có thể được thực hiện bằng cách sử dụng bộ tiền xử lý (#defines).
  • Một khả năng khác cho "đánh dấu" tùy chỉnh trong mã C/C++ ví dụ: #MY_PRAGMA là sử dụng bộ tiền xử lý của riêng bạn trước bộ tiền xử lý C/C++.

Ví dụ về loại xử lý này được sử dụng cho thư viện QT, hệ thống Metaobject không chuẩn tương tác với trình biên dịch Qt MOC. Điều này được sử dụng để mở rộng một số cấu trúc không phải C++ (ví dụ Q_OBJECT, Q_PROPERTY, vv) mà sau này được cung cấp với một cú pháp hợp lệ cho trình biên dịch C++.

+4

Tôi không nghĩ rằng ông đang tìm cách để làm cho một pragma không làm gì cả, nhưng đúng hơn là anh ta nghĩ đó là một cách có thể quash cảnh báo. 'ugubugu' là một pragma không xác định, vì vậy hãy đăng ký nó, nhưng làm cho nó không làm gì cả, vì vậy bây giờ nó là một pragma đã biết mà sẽ không tạo ra một cảnh báo. –

+0

@Dennis Zickefoose, nhưng tại sao cuối cùng anh ấy chơi với các pragmas tùy chỉnh? Tôi nghi ngờ anh ta đang cố sử dụng chúng như 'đánh dấu' trong mã hoặc một cái gì đó như thế, hoàn toàn hợp lệ nhưng có những lựa chọn thay thế bằng cách sử dụng pragmas của riêng bạn (có thể va chạm với những nhà cung cấp trình biên dịch vì không có sự thống nhất cho chúng) –

1

Tôi giả sử bạn muốn vô hiệu hóa các cảnh báo pragma vì nó là cái gì đó có giá trị trên một nền tảng nhưng không phải nền tảng khác. Nếu đó là trường hợp, bạn có thể sử dụng macro để chọn lọc kích hoạt pragma, loại bỏ sự cần thiết phải ngăn chặn cảnh báo.

Ví dụ, nếu bạn muốn pragma trên Visual C++ chỉ, bạn có thể làm:

#if defined(_MSC_VER) 
# define SAFE_PRAGMA_UGUBUGU __pragma(ugubugu) 
#else 
# define SAFE_PRAGMA_UGUBUGU 
#endif 

Và sau đó, bạn có thể viết

SAFE_PRAGMA_UGUBUGU 
#pragma untiunti 
int main() {return 0;} 
Các vấn đề liên quan