2012-03-08 44 views
6

Tôi đang viết một Tiện ích mở rộng Ruby C, nơi tôi đang sử dụng math.h. Nó đang được biên dịch trên cả OSX và Windows. Trong Windows tôi sử dụng nmake đi kèm với Visual Studio Express C++ 2010.Làm thế nào để xác định một hàm trong C nếu nó chưa được xác định trước?

Tôi thấy rằng VS không bao gồm chức năng round() trong math.h của chúng. Vì vậy, tôi đã thêm này để bù đắp:

static inline double round(double value) 
{  
    return floor(value + 0.5); 
} 

Đó tắt khóa học gây ra một lỗi khi biên soạn theo OSX như round() có được định nghĩa. (Các lỗi thực tế tôi nghĩ được rằng tôi tuyên bố tôi tĩnh sau khi nó đã được công bố một phiên bản không tĩnh.

Bất kể, tôi muốn tránh xác định lại chức năng nếu nó tồn tại.

Tại Hiện nay tôi có điều này có điều kiện:.?

#ifdef _WIN32 
static inline double round(double value) 
{  
    return floor(value + 0.5); 
} 
#endif 

đó đã làm việc trong kịch bản của tôi - nhưng nó có vẻ hơi chung chung Ý tôi là, những gì nếu tôi biên dịch với một trình biên dịch khác nhau trong môi trường Windows

Vì vậy, câu hỏi của tôi là, tôi có thể phát hiện nếu một hàm đã được xác định và sau đó tránh tự định nghĩa nó?

Hoặc, tôi có thể phát hiện cụ thể trình biên dịch sử dụng nmake sử dụng - cl Tôi nghĩ rằng đó là?

Tôi nghĩ rằng tôi lý tưởng có thể phát hiện nếu hàm đã được xác định, vì nó có vẻ là phương pháp mạnh mẽ nhất.

Trả lời

0

tôi thấy rằng tiện ích MKMF Ruby có một phương pháp have_func rằng người ta có thể sử dụng để kiểm tra sự tồn tại của chức năng: http://apidock.com/ruby/Object/have_func

tôi thêm have_func('round', 'math.h') đến file extconf.rb của tôi mà sau đó đã cho tôi một hằng số HAVE_ROUND tiền xử lý.

Sau đó, tôi một cách an toàn có thể định nghĩa tròn() mình có đúng không tồn tại:

#ifndef HAVE_ROUND 
static inline double round(double value) 
{  
    return floor(value + 0.5); 
} 
#endif 

Làm việc một cách hoàn hảo! :)

2

Điều đó có tác dụng trong kịch bản của tôi - nhưng có vẻ hơi chung chung. Tôi có nghĩa là, những gì nếu tôi biên dịch với một trình biên dịch khác nhau trong Windows?

  1. Chung là tốt.
  2. Việc bạn sử dụng trình biên dịch nào không quan trọng; bạn chỉ đơn giản là kiểm tra nếu một biểu tượng được xác định. Bạn có thể định nghĩa biểu tượng đó bằng cách sử dụng bất kỳ trình biên dịch nào, nó không quan trọng. ifdef s thường là cách bạn xử lý các vấn đề về tính di động.
  3. round được xác định theo tiêu chuẩn C99. VS không hỗ trợ C99 tại thời điểm này, đó là lý do tại sao nó bị thiếu.
+0

Quan tâm của tôi là, nếu tôi ví dụ cập nhật Visual Studio và 'math.h' sau đó đã bao gồm' round() '- sau đó sẽ có một xung đột như dưới OSX. Đó là lý do tại sao tôi nghĩ rằng việc kiểm tra tính năng thay vì môi trường là một ý tưởng tốt hơn. Đó là dòng suy nghĩ tôi có từ phát triển web, nơi bạn kiểm tra các tính năng thay vì ngửi chuỗi tác nhân người dùng. – thomthom

+0

@thomthom: Vâng, nhưng phát triển web aint này =). Đây là cách bạn làm điều đó nói chung. Đôi khi, khi bạn thay đổi các trình biên dịch, mọi thứ sẽ bị hỏng và bạn cần sửa chúng, nhưng nó có thể tránh được phần lớn. Trong trường hợp này, 'round' được thêm vào C99. VS không hỗ trợ C99, đó là lý do tại sao nó không có mặt. –

+0

Tự động xác thực của GNU sử dụng cách tiếp cận dựa trên tính năng, # define'ing hằng số của biểu mẫu 'HAVE_feature'. Ví dụ: bạn có thể xác định 'HAVE_ROUND'. Vì nó phụ thuộc vào trình biên dịch trong trường hợp này, bạn có thể làm một "-DHAVE_ROUND = 0" trong các định nghĩa tiền xử lý C của bạn trong lệnh biên dịch của bạn; để nó không được định nghĩa trong các trình biên dịch có vòng tròn(). Trình bao quanh hàm round() của bạn sau đó sẽ đọc '#if defined (HAVE_ROUND) &&! HAVE_ROUND ... khai báo hàm ... # endif'. –

0

Điều bạn đã làm là cách xử lý không tương thích chính xác. Bạn đã nhận thấy rằng cách xử lý sự không tương thích phụ thuộc hệ thống này là 'không chung chung', nhưng ngược lại với các ngôn ngữ như JAVA tóm tắt các vấn đề bạn phải đối phó với những thứ như vậy. Mặt khác, bạn sẽ luôn nhận được hiệu suất tốt nhất mà nền tảng cung cấp.

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