2017-01-02 80 views
3

我试着在我的例程中使用fls。但是,并不是每个系统都有这个功能。所以,我发布了我自己的版本fls。我想知道是否有任何方法让程序使用系统实现并找不到,请使用我自己的实现?如果发现使用系统实现,否则使用我自己的实现

#include "strings.h" 
#include <stdio.h> 

int fls(int mask); 

int foo(int N) 
{ 
    int tmp = 1 << (fls(N)); 
    return tmp; 
} 

/* 
* Find Last Set bit 
*/ 
int 
fls(int mask) 
{ 
    int   bit; 
    if (mask == 0) 
    return (0); 
    for (bit = 1; mask != 1; bit++) 
    mask = (unsigned int) mask >> 1; 
    return (bit); 
} 
+1

你要求'#ifndef fls'你的fls在这里声明'#endif'预处理器有条件吗? (当然在不同的行上) –

+1

最常见的方式可能是在C中不这样做,而是使用其他工具来检查'fls'是否可用,并且通常通过宏定义来指示程序,有时通过过滤源文件进行编译。 autoconf是可以做到这一点的工具之一,还有很多其他的工具。这是否适用于您取决于您​​的构建系统和支持的系统。你能提供一些细节吗? – hvd

+0

@ DavidC.Rankin不确定。这是这种情况下的最佳做法吗? – zack

回答

1

您可以使用弱功能。

https://en.wikipedia.org/wiki/Weak_symbol

在默认情况下,没有任何注释,在对象文件中的符号是 强。在链接期间,强符号可以覆盖同名的弱符号 。对于C++

同样的问题,从C实现Can I re-define a function or check if it exists?

int __attribute__((weak)) fls(int mask){ .. } 

所以如果系统fls被定义为强,你fls实现将覆盖略有不同。

+0

你确定'__attribute __((weak))'是否便携? –

+0

我无法找到可移植性,但它列在gcc.gnu文档中的“常用函数属性”下:https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-属性 – cokceken

+0

这正是我的意思:它是一个海湾合作委员会的扩展,其他编译器确实存在.. –