我正在编写一个Ruby C扩展,我正在使用math.h
。它是在OSX和Windows上编译的。在Windows下,我使用Visual Studio Express C ++ 2010附带的nmake
。
我发现VS在round()
中没有包含math.h
功能。所以我补充说这是为了补偿:
static inline double round( double value )
{
return floor( value + 0.5 );
}
当在OSX下编译为round()
时,该过程导致错误。 (我认为实际的错误是我已经宣布我的静态版已经被声明为非静态版本。
无论如何,如果确实存在,我想避免重新定义该功能。
目前我有条件:
#ifdef _WIN32
static inline double round( double value )
{
return floor( value + 0.5 );
}
#endif
这在我的场景中起作用 - 但它似乎有点通用。我的意思是,如果我在Windows下使用不同的编译器编译怎么办?
所以我的问题是,我可以检测一个函数是否已经定义,然后自己避免定义它吗?
或者,我可以具体检测编译器nmake
使用 - cl
我认为它是什么?
我认为我理想情况下能够检测到函数是否已经定义,因为它似乎是最强大的方法。
答案 0 :(得分:2)
这在我的场景中起作用 - 但它似乎有点通用。我的意思是,如果我在Windows下使用不同的编译器编译怎么办?
ifdef
通常是您处理可移植性问题的方式。round
由C99标准定义。 VS此时不支持C99,这就是它丢失的原因。答案 1 :(得分:0)
您所做的是处理不兼容问题的正确方法。
您已经注意到这种处理系统相关不兼容性的方式是“非通用的”,但与JAVA这样的语言相反,这些语言抽象了您必须处理此类问题的问题。另一方面,您将始终获得平台提供的最佳性能。
答案 2 :(得分:0)
我发现Ruby的mkmf实用程序有一个方法have_func
,可以用来检查函数是否存在:http://apidock.com/ruby/Object/have_func
我将have_func( 'round', 'math.h' )
添加到我的extconf.rb
文件中,然后该文件给了我一个HAVE_ROUND
预处理器常量。
然后我可以安全地定义round(),它不存在:
#ifndef HAVE_ROUND
static inline double round( double value )
{
return floor( value + 0.5 );
}
#endif
工作完美! :)