2017-03-12 6 views
3

次のテストコードに関しては、#errorディレクティブのためにコンパイルされないと予想されます。Clangの__has_builtinが常に機能しない

#if __has_builtin(__builtin_types_compatible_p) 
#error ("Hello") 
#endif 

#include <stdio.h> 

int main (void) 
{ 
    if (__builtin_types_compatible_p(int, const int)) { 
     printf("INT ARE SAME!!!\n"); 
    } 
    return 0; 
} 

しかし、それはコンパイルだけでなく、それはまた__builtin_types_compatible_pが存在するにもかかわらず、__has_builtinがそれを検出していないことを意味するINT ARE SAME!!!をプリントアウトします。それはなぜです?さらに重要なのは、組み込み関数を検出する他の方法がありますか?

これは、Clang 3.8および3.9(現在の安定した分岐)でテストされました。コードはclang --std=c99 -Wall -Wextra test.cを使用してコンパイルされました。

答えて

3

LLVM開発者によれば、

__has_builtinは、組み込み機能を検出します。あなたの例では

それはタイプではなく、値がかかるため、__builtin_types_compatible_pは、全く機能

ではありません。

したがって、__has_builtin(__builtin_types_compatible_p)は、正しく設計されたものと同様のfalseを返します。

http://lists.llvm.org/pipermail/cfe-dev/2017-July/054590.html

関連する問題