gcc組み込み関数を使用するコードがあります。 intrinsicがない場合に備えてコードをインクルードしたいと思います。これどうやってするの?組み込み関数/組み込み関数のテスト
#ifdef __builtin_ctzll
は機能しません。
gcc組み込み関数を使用するコードがあります。 intrinsicがない場合に備えてコードをインクルードしたいと思います。これどうやってするの?組み込み関数/組み込み関数のテスト
#ifdef __builtin_ctzll
は機能しません。
最近のバージョンの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()
をサポートします期待しましょう。
__builtin_ctzll
がマクロ名として定義されているかどうか#ifdef
ディレクティブのチェックは、それが__builtin_ctzll
機能が存在するかどうかを判断するのに役立ちません。
私は、gccの組み込み関数に慣れていないので、これよりも手助けをしています。組み込み関数がどのように失われていますか?
たとえば、特定のアーキテクチャではサポートされていません。 – Charles
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
これは、より複雑な構成ユーティリティを使用することを避けることができます。
これに該当する可能性がありますか?当分の間、あなたのソリューションは、gccが組み込み関数を使用するのを阻止します。私は、gccで機能が導入されてから少なくとも5年間、それをサポートしていないバージョンをまだ見ているだろうと思っていますが、一部のディストリビューションは新しいバージョンのバージョンではかなり遅いです。 –
__has_builtin()マクロは、2012年1月にGCCメーリングリストの一部のスレッドで言及されています。このスレッドhttp://comments.gmane.org/gmane.comp.gcc.help/42610も有望です。しかし、GCC 4.8にとっては遅すぎると思いますので、もう一年待たなければなりません。 – Linoliumz