2012-01-04 29 views
6

Tôi muốn có một macro đó là gọi như thế này:Làm cách nào để triển khai macro tạo chuỗi được trích dẫn cho _Pragma?

GCC_WARNING(-Wuninitialized) 

mà mở rộng để mã như thế này:

_Pragma("GCC diagnostic ignored \"-Wuninitialized\"") 

Tôi không có may mắn nhận được này để làm việc, như các thủ thuật thông thường của preprocessor tham gia và stringifying dường như không áp dụng hoặc tôi không biết làm thế nào để áp dụng chúng ở đây.

+0

Đó là một lỗi đánh máy, phải không? –

Trả lời

0

Cũng có thể chấp nhận được nếu đối số macro được đặt trong dấu nháy đơn? Nếu vậy, bạn có thể sử dụng này:

#define GCC_WARNING(x) _Pragma("GCC diagnostic ignored '" #x "'") 

Khi gọi nó như GCC_WARNING(-Wuninitialized) nó mở rộng để

_Pragma("GCC diagnostic ignored '" "-Wuninitialized" "'") 

tôi phải tận dụng các chuỗi concatenating hành vi của C (printf("a" "b"); cũng giống như printf("ab");) ở đây kể từ khi sử dụng "'#x'" trong macro sẽ tránh được rằng mở rộng x.

+0

Hầu như ... thực sự "_Pragma" có ý nghĩa đặc biệt đối với gcc. Tôi đã đăng một giải pháp tương tự, nhưng tôi nhận ra rằng nó không hoạt động với gcc của tôi vì trình xử lý tiền tố than phiền ("error: _Pragma lấy một chuỗi ký tự được viết ngoặc"). –

+1

Điều đó sẽ không hoạt động - '_Pragma' diễn giải đối số của nó trước khi chuỗi được nối, vì vậy nó sẽ thấy hai chuỗi chứ không phải một chuỗi. Không giống 'printf', nó là một cấu trúc đặc biệt theo các quy tắc đặc biệt. – Lindydancer

+0

Ah, thật ngớ ngẩn, tôi không nghĩ rằng đây là một câu hỏi cụ thể về GCC. Tôi nghĩ '_Pragma' là một số chức năng gỡ lỗi tùy chỉnh nhưng bây giờ tôi nhìn vào tên của macro, tôi nên biết rõ hơn. –

14

Với sự giúp đỡ ít tiền xử lý ma thuật:

#define HELPER0(x) #x 
#define HELPER1(x) HELPER0(GCC diagnostic ignored x) 
#define HELPER2(y) HELPER1(#y) 
#define GCC_WARNING(x) _Pragma(HELPER2(x)) 

GCC_WARNING(-Wuninitialized) 
+0

Cảm ơn nhưng điều đó không hoạt động, có thể do thực tế là nó không đặt \ "xung quanh -Wuninitialized. Việc sử dụng vĩ mô trên sản lượng lỗi GCC sau đây: bỏ qua #pragma chẩn đoán GCC [-Wunknown-pragmas] – ThreeBit

+0

Nó đặt dấu ngoặc kép xung quanh -Wuninitialized Vấn đề là một lỗi đánh máy 'chẩn đoán' thay vì' chẩn đoán' - Tôi đã cố định nó trong câu trả lời ở trên – Lindydancer

+1

bạn tiết kiệm cuộc sống của tôi – MoLice