私はGCCの拡張に関する二つの質問clangでコンパイルされたコードでGCC拡張を使用していますか?私はGCCの属性/エクステンションを使用してライブラリをコンパイルする場合
を持って、彼らは私が例
clang
のためにコンパイルされたプログラムにリンクしていても動作しますか?関数宣言またはプロトタイプで関数/拡張機能を宣言する必要がありますか?
私はGCCの拡張に関する二つの質問clangでコンパイルされたコードでGCC拡張を使用していますか?私はGCCの属性/エクステンションを使用してライブラリをコンパイルする場合
を持って、彼らは私が例clang
のためにコンパイルされたプログラムにリンクしていても動作しますか?
関数宣言またはプロトタイプで関数/拡張機能を宣言する必要がありますか?
属性/エクステンションのみコード生成ではなくインタフェースに影響を与える場合は、それが動作するはずです。
属性によって異なります。例えば、pure
,、またはnonnull
のような属性は、関数を使用するすべての翻訳ユニットがそれらを見ることができないとうまくいかないので、ヘッダーのプロトタイプに入れてください(例:__attribute__((__pure__))
などの下線付きのフォームを使用してください)。
一方、コード生成や可視性に影響を与える属性は実装上でなければなりません。そうでない場合は、ライブラリユーザがあなたのライブラリによって提供される関数をオーバーライドすることを決定した場合、オーバーライド。いずれの場合においても
あなたは宣言で属性を置けば、それはあまりにも定義に影響を与えます(定義が明確化のためにJonathan Lefflerに宣言-感謝を見ていると仮定)が、定義は追加属性ない存在に取ることができます宣言の中で。
拡張子によって異なります。
は、この文書では、クランが提供する言語拡張について説明しhttps://clang.llvm.org/docs/LanguageExtensions.html
を参照してください。ここに挙げた言語拡張に加えて、 では、広範囲のGCC拡張を でサポートすることを目指しています。これらの拡張機能の詳細については、 のGCCマニュアルを参照してください。
gccで属性を使用してライブラリをコンパイルできるかどうかと、それが既にコンパイルされているので他のコンパイラと一緒に使用できるかどうかさらに疑問に思っていました。私は特にclangに興味がありませんでした –
あなたは言った: "宣言に属性を置くと、定義にも影響がある" - 定義が宣言を見る限り同意する。人々はコードを乱暴にコードすることが知られています)。それは、「定義ではわからない宣言」の問題に遭遇すると、より大きな問題を抱えているということです。 –