Trong tiêu đề sẽ có thể biên dịch trong các tệp C và C++, trong Visual Studio (2010) và MinGW (32-bit - v3.4.5, 64-bit - v4.5.0) tôi cố gắng để giảm thiểu kích thước bằng cách thay đổi mỗi một trong những dòng như vậy (có rất nhiều trong số họ):đặt #warning bên trong cơ thể # define
// for symbol A
#ifdef __GNUC__
# warning Symbol A is deprecated. Use predefined const cnA instead.
#else
# pragma message("Symbol A is deprecated. Use predefined const cnA instead.")
#endif
// Same for B
// Same for C
// . . .
để
// define this once:
#ifdef __GNUC__
# define X_Warning(x) #warning "Symbol " x " is deprecated. Use cn" x // (1)
#else
# define X_Warning(x) __pragma(message("Symbol " x " is deprecated. Use cn" x "))
#endif
// and use like this:
X_Warning("A")
X_Warning("B")
X_Warning("C")
hay, ít nhất là như thế này:
// define this once:
#ifdef __GNUC__
# define Y_Warning(x) #warning x // (2)
#else
# define Y_Warning(x) __pragma(message(x))
#endif
// and use like this:
Y_Warning("Symbol A is deprecated. Use predefined const cnA instead.")
Y_Warning("Symbol B is deprecated. Use predefined const cnB instead.")
Y_Warning("Symbol C is deprecated. Use predefined const cnC instead.")
. . .
Nhưng dòng được đánh dấu bằng (1) không hoạt động.
__pragma
tương đương với Microsoft cho #pragma
để sử dụng trong loại tình huống này.
- Cách thích hợp để thực hiện việc này là gì?
- Thậm chí có thể cho MinGW/gcc không?
- là
__GNU__
biểu tượng phù hợp để sử dụng cho những thứ như vậy?
P.S. Tôi quên đề cập đến A, B, C .. là các biểu tượng # define-ed. Trong trường hợp đó, bạn không thể thực hiện với MinGW cũ của tôi v3.4.5 (ít nhất là trong trường hợp của tôi với cấu hình cụ thể này). Và câu trả lời của @ Edwin là chính xác.
Nhưng _Pragma được hỗ trợ bởi các phiên bản mới hơn của MinGW và, nhờ @Christoph cho một câu trả lời, chúng ta có thể làm như sau:
// define this once:
#ifdef __GNUC__
# define DO_PRAGMA(x) _Pragma (#x)
# define X_Warning(x) DO_PRAGMA(message "Symbol " #x " is deprecated. Use cn" x)
#else
# define X_Warning(x) __pragma(message("Symbol " x " is depricated. Use cn" x))
#endif
// and use like this:
#ifdef A
X_Warning("A")
#endif
#ifdef C
X_Warning("B")
#endif
#ifdef B
X_Warning("C")
#endif
Đánh dấu như bị phản đối dường như làm việc trong một số trường hợp, nhưng không cho tôi. Nó đòi hỏi bạn phải xác định các ký hiệu không được chấp nhận trước khi sử dụng chúng mà không phải là trường hợp của tôi và ngoài tầm kiểm soát của tôi.
depricated -> deprecated –
bạn không thể làm điều đó: Bạn không thể có chỉ thị tiền xử lý là kết quả của việc mở rộng macro – Anycorn
MSVS không hỗ trợ chỉ thị #warning không? –