2017-01-02 68 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

這正是我的意思:它是一個海灣合作委員會的擴展,其他編譯器確實存在.. –