2012-08-14 31 views
5

Trong ngữ cảnh của ứng dụng hỗn hợp C/Fortran, có cách nào để kiểm tra xem trình biên dịch có biết "iso_c_binding" (ví dụ GCC 4.1.2 không biết), 4.3.4), như một chỉ thị tiền xử lý hay gì đó? Tôi không thể chỉ đơn giản là kiểm tra phiên bản của GCC vì tôi có thể sử dụng các trình biên dịch khác.Kiểm tra xem iso_c_binding có sẵn tại thời điểm biên dịch

Cảm ơn

+0

Kiểm tra xem '#ifdef iso_c_binding' có hoạt động ... –

+3

Biên dịch chương trình đơn giản sử dụng những thứ bạn cần từ' ISO_C_BINDING'. Nếu nó biên dịch và chạy, bạn có thể thêm một định nghĩa ký hiệu tiền xử lý vào một số tệp tiêu đề cấu hình. Làm cho phần này của thủ tục xây dựng mã của bạn. Đây là cách GNU 'autoconf' thực hiện nó trong các kịch bản' configure'. –

+0

Có thể làm điều gì đó tương tự như vậy với CMake không? – sunmat

Trả lời

2

chỉ có hai lựa chọn của bạn, mà tôi có thể nghĩ ra, là để cuộn phiên bản của riêng bạn iso_c_binding cho các hệ thống mà không có mô-đun này (as suggested by @HighPerformanceMark) hoặc sử dụng preprocessors có điều kiện biên dịch các phần của mã của bạn tùy thuộc vào phiên bản trình biên dịch. Trong cả hai trường hợp, bạn sẽ phải làm việc để đảm bảo rằng mã của bạn là di động trên các hệ thống. Theo đề xuất của @HighPerformanceMark, bạn có thể sao chép và dán triển khai mã nguồn mở iso_c_binding, nhưng đối với mỗi hệ thống mới, bạn chuyển mã của mình đến bạn sẽ phải kiểm tra xem việc triển khai này có chính xác hay không.

Tùy thuộc vào cách bạn muốn mã của mình hoạt động nếu iso_c_bindingkhông avaiable Tôi sẽ khuyên bạn nên sử dụng phương pháp tiền xử lý. Bạn nói rằng "Tôi không thể đủ khả năng để chỉ cần kiểm tra phiên bản của GCC kể từ khi tôi có thể sử dụng trình biên dịch khác". Tuy nhiên, tất cả các tùy chọn của bạn sẽ yêu cầu làm việc một phần để duy trì mã của bạn để sử dụng trên các hệ thống khác nhau, phương pháp tiền xử lý yêu cầu, trong opionion của tôi, số lượng công việc ít nhất.

Mã sau xác định phiên bản trình biên dịch bằng cách sử dụng bộ tiền xử lý và có thể được sử dụng để biên dịch mã của bạn theo điều kiện dựa trên các phiên bản trình biên dịch có đáp ứng một số phiên bản tối thiểu không. Đối với gfortran:

Nếu GNU Fortran gọi Preprocessor, __GFORTRAN__ được định nghĩa và __GNUC__, __GNUC_MINOR____GNUC_PATCHLEVEL__ có thể được sử dụng để xác định phiên bản của trình biên dịch.

Trong một tệp, giả sử precomp.inc Tôi sẽ bao gồm một số kiểm tra biên dịch trước để xác định các tính năng bao gồm trong mã của bạn. Ví dụ, tôi sẽ kiểm tra phiên bản trình biên dịch và, nếu nó hỗ trợ việc sử dụng mô-đun iso_c_binding tôi sẽ xác định macro tiền xử lý HAS_ISO_C_BINDING (hoặc tương tự). Các tập tin precomp.inc sau đó có thể được bao gồm trong các phần khác của mã của bạn. Tập tin này có thể giống như thế:

!> \file precomp.inc 
!! Preprocessor feature detection. 

#if defined(__GFORTRAN__) 

#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 
#define HAS_ISO_C_BINDING 1 
#else 
#define HAS_ISO_C_BINDING 0 
#endif 

#elif defined(__INTEL_COMPILER) 
#error "I haven't implemented this yet..." 

#else 
#error "Compiler not yet supported." 

#endif 

Các lỗi trong #else khoản chính thức có thể được thay thế bằng HAS_ISO_C_BINDING=0, nếu bạn muốn để có thể biên dịch mà không cần sự hỗ trợ cho các mô-đun iso_c_binding.

nguồn Fortran của bạn sẽ giống như

program main 

#include 'precomp.h' 
#if HAS_ISO_C_BINDING 
use iso_c_binding 
#endif 

implicit none 

! Some code... 

#if HAS_ISO_C_BINDING 
! Code which depends on iso_c_binding 
#else 
! Fallback code 
#end if 

! Some more code... 

end program main 

Một lần nữa, phương pháp quyền sử dụng phụ thuộc vào cách bạn muốn mã để biên dịch nếu iso_c_binding không khả dụng. Nếu mã của bạn cần biên dịch trên các hệ thống không có mô-đun này thì câu trả lời của @ HighPerformanceMark có lẽ tốt hơn. Nếu bạn chỉ có thể tăng lỗi tại thời gian biên dịch hoặc nếu bạn có một số mã dự phòng nếu iso_c_binding không có sẵn thì tôi sẽ sử dụng phương pháp tiền xử lý này vì điều này chỉ yêu cầu thêm một kiểm tra bổ sung cho mỗi trình biên dịch mới mà bạn cần sử dụng.

+0

Whoa there matey. cụ thể là DID KHÔNG đề xuất sao chép các nguồn Intel Fortran cho 'iso_c_binding' vì đó có thể là vi phạm IPR của Intel, có thể là bất hợp pháp hoặc trái với các điều khoản của hợp đồng mà nhà tuyển dụng của tôi có với Intel để cung cấp phần mềm. việc triển khai mã nguồn mở của mô-đun. Tôi đã chỉnh sửa câu hỏi của bạn để xóa xác nhận phỉ báng của bạn. –

+0

Đủ công bằng - xin lỗi s cho điều đó. – Chris

0

Câu hỏi được định hướng sai. Thực tế những gì bạn đang hỏi là liệu bộ xử lý Fortran đồng hành (giả sử nó tồn tại) có hỗ trợ các khía cạnh cần thiết của khả năng tương tác C mà chương trình C của bạn yêu cầu nó.Có nhiều khả năng tương tác với C hơn là sự hiện diện của một mô-đun nội tại. Ví dụ, nó là khá hợp pháp cho một bộ vi xử lý F2003 để cung cấp một ISO_C_BINDING mà sau đó nói rằng gần như tất cả các khía cạnh của khả năng tương tác C không được hỗ trợ (hằng số như C_FLOAT, C_REAL, vv, có thể có giá trị âm, có nghĩa là "không được hỗ trợ ").

Vì vậy, trừ việc bạn sử dụng C khả năng tương tác là cực kỳ cơ bản (có một số khía cạnh cần phải được hỗ trợ bởi một bộ xử lý F2003 - như C_INT, C_LOC, C_F_POINTER, vv) những cách duy nhất thực tiễn để xác định khả năng là:

  • Để biên dịch chương trình Fortran nhỏ sử dụng rõ ràng các thực thể bắt buộc và kiểm tra giá trị của chúng (các số âm khác nhau giải thích tại sao bộ xử lý Fortran không hỗ trợ). Như những người khác đã viết, sự thành công hay thất bại của việc biên dịch, và có lẽ đầu ra chương trình tiếp theo nếu biên dịch thành công, sau đó có thể được sử dụng để cấu hình các khía cạnh khác của bản dựng của bạn.

  • Để đọc Sổ tay của bộ xử lý Fortran.

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