2011-01-21 30 views
6

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.

  1. Cách thích hợp để thực hiện việc này là gì?
  2. Thậm chí có thể cho MinGW/gcc không?
  3. __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.

+0

depricated -> deprecated –

+3

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

+0

MSVS không hỗ trợ chỉ thị #warning không? –

Trả lời

4

Trong msvs năm 2010 có là thế này:

#pragma deprecated(identifier1 [,identifier2, ...]) 

không biết về trình biên dịch khác

và cụ microsoft:

__declspec(deprecated) void func1(int) {} 
__declspec(deprecated("** this is a deprecated function **")) void func2(int) {} 
__declspec(deprecated(MY_TEXT)) void func3(int) {} 
+2

Tương đương GCC là '__attribute __ ((không được chấp nhận))', xem http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html. –

+0

+1, tôi nghĩ rằng đó có lẽ là tốt nhất để giải quyết vấn đề thực sự (biểu tượng không dùng nữa) sau đó để hack thông qua với "tin nhắn". Nó có thêm tiền thưởng mà, AFAIR, cho gcc phần mở rộng này là hiện nay từ một thời gian dài, có lẽ cũng cho cũ 3.4.5. –

+0

Có vẻ như đây là câu trả lời cho câu hỏi được đăng. Cảm ơn. Nhưng, có vẻ như tôi quên đề cập đến rằng A, B, C là # ký hiệu xác định và bây giờ tôi đã làm cho chúng const int cnA, ... hằng số. – sny

3

Bạn không thể xây dựng #pragma hoặC#warning với macro nhưng tôi nghĩ bạn có thể làm điều gì đó như:

#ifdef __GNUC__ 
# define Y_Warning(x) message x 
#else 
# define Y_Warning(x) message(x) 
#endif 

#pragma Y_Warning("Symbol A is depreboned. Use predefined const cnA instead.") 
#pragma Y_Warning("Symbol B is depronated. Use predefined const cnB instead.") 
#pragma Y_Warning("Symbol C is deprecuted. Use predefined const cnC instead.") 
+1

bạn có thể xây dựng lệnh '# pragma' thông qua các macro: C99 đã thêm toán tử' _Pragma', được hỗ trợ bởi gcc – Christoph

+0

MinGW v3.4.5 không hỗ trợ _Pragma và tại dự án này, tôi không thể nâng cấp nó một cách không may. – sny

+1

Và có vẻ như gcc không expand Y_Warning – sny

4

GCC hỗ trợ nhà điều hành C99 _Pragma và thậm chí đi kèm với example code for your use case.

+1

+1 nhưng tôi đã nghi ngờ rằng điều này sẽ làm việc cho minGW cũ v3.4.5. Và có lẽ nên thêm rằng, có, '__GNUC__' là vĩ mô chính xác để kiểm tra sự hiện diện của gcc, bất kỳ hương vị nào. –

+0

@Jens: tìm kiếm nhanh trên google cho thấy các bản sửa lỗi cho các vấn đề '_Pragma' được chuyển thành gcc-3.2.x; nó hoạt động với Cygwin-gcc 3.4.4, vì vậy tôi nghi ngờ mingw-gcc 3.4.5 cũng phải là ok; tại sao người ta sử dụng một bản phát hành trình biên dịch cũ như vậy là vượt ra ngoài tôi, mặc dù ... – Christoph

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