私はGCCで#pragma weak
ディレクティブ発見:SVR4との互換性のために弱いプラグマがどれほどサポートされていますか?gcc属性の使用に関する問題を克服していますか?
6.57.9弱いプラグマ
を、GCCが弱いとシンボルを宣言し、弱いエイリアスを定義するための#pragmaディレクティブのセットをサポートしています。
#pragma weak symbol
宣言は同じ名前の属性を持っていたかのように、このプラグマは、弱いとシンボルを宣言します。プラグマは、シンボルの宣言の前後に表示されることがあります。シンボルがまったく定義されないことは誤りではありません。
#pragma weak symbol1 = symbol2
このプラグマは、シンボル2の弱いエイリアスであることをシンボル1宣言する。 symbol2が現在の翻訳単位で定義されていないと、エラーになります。 GCCの開発者は、一般的に、私は
#pragma weak
かもしれない実際に信じるように傾いている、#pragma
が好きとプラグマ可能性があり、物事のすべての種類のための代わりに__attribute__
を使用することをお勧めしていないという事実にもかかわらずhttp://gcc.gnu.org/onlinedocs/gcc/Weak-Pragmas.html
別に__typeof
を必要とする(またはタイプを知っているとEXPを、それを綴るためにあなたを必要とするの醜さから
extern __typeof(old_name) new_name __attribute__(weak, alias("old_name"))
:ように見える属性ベースのアプローチ、より優れていることたとえそれが本当に複雑な関数型であっても)、属性ベースのアプローチの最大の課題は、文字列をgcc として生成されたアセンブリにそのまま貼り付ける必要があります。これは問題があります。なぜなら、異なるシステムには異なる名前変更特性があります(最も一般的なのは、すべてのCシンボル名に接頭辞を付けたり、何もしないことです)。alias
属性に正しい文字列を渡すには、弱いエイリアスが役立つかもしれないアプリケーションレベルのライブラリに属している知識ではありません。
構文が#pragma weak new_name = old_name
の場合、コンパイラレベルで両方の名前を処理することで、この問題を回避できるようです。誤っていない限り、両方の名前を適切に変更できます。
私の実際の質問は次の通りです:私はこの "移植性"の点で、#pragma weak
と間違っていますか?とunixのようなシステム(gcc、pcc、tinycc、icc、llvm/clangなど)の最新のコンパイラは、従来のSVR4 #pragma weak
をまだサポートしていますか?
私は、次の同様の質問を認識してんだけど、それは全く同じように見えるしないと回答が満足に私の質問に対処しないように:
How portable is weak linking? #pragma weak my_symbol
私はこの答えがあってもよいとします。このようなマクロも参照、このような使用の例についてはCPP貼り付け演算子(「##」等)
を使用して、様々な名前manglingsとの間の差を隠すことができ一部の読者にとっては有益ですが、まだ持っていない情報は提供していません。私の質問は、基本的に '#pragma weak'が*' __attribute __((weak、alias)) 'より移植性が高いか、少なくとも*移植性は低くないかどうかです。問題。 –
どちらも適切な措置で携帯できるものではありません。 #pragmaが "less less portable"であるかどうかは、おそらくそれが良い選択ではないことを示唆しています。 – Perry
C99に '_Pragma'が追加された理由は、' #pragma'が動作するたびに動作するはずです... –