2017-01-02 6 views
3

私のルーチンでflsを使用しようとしています。しかし、すべてのシステムがこの機能を持っているわけではありません。だから私はflsの自分のバージョンを出荷します。プログラムにシステム実装を使用させて見つけられないようにする方法があれば、私自身の実装を使用しているのでしょうか?findの場合はシステムの実装を使用し、それ以外の場合は独自の実装を使用してください

#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はこれを行うことができるツールの1つですが、他にもたくさんあります。これがうまくいくかどうかは、ビルドシステムとサポートされているシステムによって異なります。あなたはそれについていくつかの詳細を教えてくれますか? – 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 docsの "common function attributes"にリストされています。https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-属性 – cokceken

+0

これはまさに私が言ったことです:gcc拡張であり、他のコンパイラは存在します.. –

関連する問題