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.
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
@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. –
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'. –