2009-12-20 33 views
18

Tôi đã gặp lỗi với gcc v3.4.4 và để đặt #ifdef trong mã của tôi để khắc phục lỗi chỉ cho phiên bản trình biên dịch đó.Macro gcc được xác định trước cho số phiên bản của trình biên dịch là gì?

Trình biên dịch tiền xử lý GCC được xác định trước các macro để phát hiện số phiên bản của trình biên dịch là gì?

+1

có thể trùng lặp của [Làm cách nào để kiểm tra phiên bản hiện tại của GCC?] (Http://stackoverflow.com/questions/259248/how-do-i-test-the-current-version-of-gcc), cả hai loại chung C/C++ –

Trả lời

26

Từ cpp thủ gnu ...


__GNUC__ 
__GNUC_MINOR__ 
__GNUC_PATCHLEVEL__ 

Những macro được định nghĩa bởi tất cả các trình biên dịch GNU mà sử dụng tiền xử lý C: C, C++, Objective-C và Fortran. Giá trị của chúng là phiên bản chính, phiên bản nhỏ và mức bản vá của trình biên dịch, dưới dạng hằng số nguyên. Ví dụ: GCC 3.2.1 sẽ xác định __GNUC__ thành 3, __GNUC_MINOR__ thành 2 và __GNUC_PATCHLEVEL__ thành 1. Các macro này cũng được xác định nếu bạn gọi trực tiếp bộ xử lý trước.

__GNUC_PATCHLEVEL__ là mới đối với GCC 3.0; nó cũng có mặt trong các ảnh chụp nhanh phát triển được sử dụng rộng rãi dẫn đến 3.0 (tự xác định là GCC 2.96 hoặc 2.97, tùy thuộc vào ảnh chụp bạn có). Nếu tất cả những gì bạn cần biết là liệu chương trình của bạn có đang được biên soạn bởi GCC hay một trình biên dịch không phải GCC tuyên bố chấp nhận các phương ngữ GNU C, bạn có thể chỉ cần thử nghiệm __GNUC__. Nếu bạn cần viết mã phụ thuộc vào một phiên bản cụ thể, bạn phải cẩn thận hơn.Mỗi khi phiên bản nhỏ được tăng lên, mức bản vá được đặt lại về 0; mỗi khi phiên bản chính được tăng lên (điều này hiếm khi xảy ra), phiên bản nhỏ và mức bản vá được đặt lại. Nếu bạn muốn sử dụng các macro được xác định trước trực tiếp trong điều kiện, bạn sẽ cần phải viết như sau:

  /* Test for GCC > 3.2.0 */ 
      #if __GNUC__ > 3 || \ 
       (__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \ 
           (__GNUC_MINOR__ == 2 && \ 
            __GNUC_PATCHLEVEL__ > 0)) 
+1

Thiếu dấu ngoặc đơn phải ở cuối macro tiền xử lý? – user318904

+0

Có phải là tôi, hoặc không có tiếng kêu có cùng \ _ \ _ GNUC \ _ \ _ được xác định? Vì vậy, không phải là một thử nghiệm thực sự cho gcc? – Bram

15

__GNUC__, __GNUC_MINOR____GNUC_PATCHLEVEL__.

Ví dụ, GCC 4.0.1 sẽ làm:

#define __GNUC__ 4 
#define __GNUC_MINOR__ 0 
#define __GNUC_PATCHLEVEL__ 1 

Đây là một dòng lệnh nhỏ mà là tốt đẹp để nhớ khi bạn đang tự hỏi đó là những prede fi ned chỉ thị Preprocessor de được xác định bởi trình biên dịch GNU GCC dưới của bạn môi trường lập trình hiện tại:

gcc -E -dM - </dev/null | ít

+4

Bí quyết tuyệt vời về các chỉ thị tiền xử lý trước GCC. Nó thậm chí còn tốt hơn khi được sắp xếp: 'gcc -E -dM - Bart

+0

Cảm ơn bạn đã tip - '' gcc -E -dM - Phil

1

Từ online docs:

__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
Những macro được định nghĩa bởi tất cả các trình biên dịch GNU mà sử dụng tiền xử lý C: C, C++, Objective-C và Fortran. Giá trị của chúng là phiên bản chính, phiên bản nhỏ và mức bản vá của trình biên dịch, dưới dạng hằng số nguyên. Ví dụ, GCC 3.2.1 sẽ định nghĩa __GNUC__ thành 3, __GNUC_MINOR__ thành 2 và __GNUC_PATCHLEVEL__ thành 1. Các macro này cũng được định nghĩa nếu bạn gọi trực tiếp bộ xử lý trước.

__VERSION__
Macro này mở rộng thành một chuỗi liên tục trong đó mô tả các phiên bản của trình biên dịch sử dụng. Bạn không nên dựa vào nội dung của nó có bất kỳ hình thức cụ thể, nhưng nó có thể được tính vào để chứa ít nhất số phát hành.

4

Có 3 macro cho phiên bản gcc bạn có thể thử nghiệm.

__GNUC_MINOR__ 
__GNUC_PATCHLEVEL__ 
__GNUC__ 

ví dụ: tôi gcc v 4.3.1 định nghĩa chúng như vậy:

#define __GNUC_MINOR__ 1 
#define __GNUC_PATCHLEVEL__ 3 
#define __GNUC__ 4 

Bạn có thể xem "buitin" macro được xác định bằng cách chạy

gcc -E -dM -xc/dev/null

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