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_binding
là khô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__
và __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.
Kiểm tra xem '#ifdef iso_c_binding' có hoạt động ... –
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'. –
Có thể làm điều gì đó tương tự như vậy với CMake không? – sunmat