2012-02-24 2 views
6

私は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

答えて

4

「の#pragma弱い」も__attribute__どちらをC標準の一部であるため、どちらも厳密に言えばポータブルではありません。 Cコンパイラの中には、GCCのC標準への拡張のほとんどと互換性を持たせようと努力しているものもあれば、そうでないものもあります。

一般的に言えば、弱い記号や弱いエイリアスについて話しているのであれば、おそらくコンパイラ間で確実に移植可能なコードを書くことができます。あなたのツールチェインさえもここで問題になります(特にリンカーを含む) - 私はあなたが慎重にテストすることなく何かに頼ることはできないと思います。

オリジナルのポスターは以下のようにコメントしていますが、実際には#pragmaは__attribute__より移植性があります。

私自身がこれまでに経験した経験は、移植性を向上させるためにマクロや他の生成コードの中に隠すことができればいいです。 __attribute__は、移植性ヘッダーファイルを隠す方が簡単です。たとえば、少なくとも1つのBSDカーネルには、マクロ内で__attribute__を使用するcdefs.hがあり、新しいコンパイラを簡単に変更できるように弱い定義がコードベース全体で行われる方法を集中管理します。 #pragmaはそのように使用するのが難しいです。 http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/sys/cdefs.h?rev=1.89.6.1&content-type=text/x-cvsweb-markup

+0

私はこの答えがあってもよいとします。このようなマクロも参照、このような使用の例についてはCPP貼り付け演算子(「##」等)

を使用して、様々な名前manglingsとの間の差を隠すことができ一部の読者にとっては有益ですが、まだ持っていない情報は提供していません。私の質問は、基本的に '#pragma weak'が*' __attribute __((weak、alias)) 'より移植性が高いか、少なくとも*移植性は低くないかどうかです。問題。 –

+1

どちらも適切な措置で携帯できるものではありません。 #pragmaが "less less portable"であるかどうかは、おそらくそれが良い選択ではないことを示唆しています。 – Perry

+1

C99に '_Pragma'が追加された理由は、' #pragma'が動作するたびに動作するはずです... –