2010-12-01 30 views
8

gcc組み込み関数を使用するコードがあります。 intrinsicがない場合に備えてコードをインクルードしたいと思います。これどうやってするの?組み込み関数/組み込み関数のテスト

#ifdef __builtin_ctzll 

は機能しません。

答えて

4

最近のバージョンのclangでは、組み込み関数が存在するかどうかを__has_builtin()マクロを使って確認することができるようになりました。

int popcount(int x) 
{ 
#if __has_builtin(__builtin_popcount) 
    return __builtin_popcount(x); 
#else 
    int count = 0; 
    for (; x != 0; x &= x - 1) 
    count++; 
    return count; 
#endif 
} 

のは、GCCはまた、将来的に__has_builtin()をサポートします期待しましょう。

+0

これに該当する可能性がありますか?当分の間、あなたのソリューションは、gccが組み込み関数を使用するのを阻止します。私は、gccで機能が導入されてから少なくとも5年間、それをサポートしていないバージョンをまだ見ているだろうと思っていますが、一部のディストリビューションは新しいバージョンのバージョンではかなり遅いです。 –

+0

__has_builtin()マクロは、2012年1月にGCCメーリングリストの一部のスレッドで言及されています。このスレッドhttp://comments.gmane.org/gmane.comp.gcc.help/42610も有望です。しかし、GCC 4.8にとっては遅すぎると思いますので、もう一年待たなければなりません。 – Linoliumz

2

__builtin_ctzllマクロ名として定義されているかどうか#ifdefディレクティブのチェックは、それが__builtin_ctzll機能が存在するかどうかを判断するのに役立ちません。

私は、gccの組み込み関数に慣れていないので、これよりも手助けをしています。組み込み関数がどのように失われていますか?

+0

たとえば、特定のアーキテクチャではサポートされていません。 – Charles

3

gccのバージョンをテストして、これがすべてのアーキテクチャーで一貫して行われることを願っているだけです。

これは保証されていませんが、私は最近組み込み関数ではなくスレッドローカルストレージで__threadと同様の問題がありました。これはいくつかのアーキテクチャ(linux)では実装されていますが、他のもの(OS X、bsd?)では実装されておらず、これをマクロで見つける方法はありませんでした。あなたはヌーを持っている場合は

はあなたのMakefileで特定の機能の存在を検出するために、類似した何かを行うことができます

__THREAD := $(shell echo '__thread int i;' | ${CC} ${CFLAGS} -xc -c -o /dev/null - 2> /dev/null || echo "NO") 
ifeq (${__THREAD},NO) 
${warning thread local storage (TLS) with '__thread' is not supported, switching to pthread_getkey} 
CFLAGS += -D__GNUC_NO_TLS__ 
endif 

これは、より複雑な構成ユーティリティを使用することを避けることができます。

関連する問題