111

プラグマステートメントを他のステートメントと一緒にマクロに埋め込む方法はありますか?

私は次のようなことを達成しようとしています:

#define DEFINE_DELETE_OBJECT(type)                      \
    void delete_ ## type_(int handle);                  \
    void delete_ ## type(int handle);                                                \
    #pragma weak delete_ ## type_ = delete_ ## type

ブースト ソリューション (ウェーブ用に保存) が存在する場合は問題ありません。

4

4 に答える 4

127

c99 または c++0x を使用している場合は、次のように使用されるプラグマ演算子があります。

_Pragma("argument")

これはと同等です

#pragma argument

マクロで使用できることを除いて (c99 標準のセクション 6.10.9、または c++0x 最終委員会ドラフトの 16.9 を参照)

例えば、

#define STRINGIFY(a) #a
#define DEFINE_DELETE_OBJECT(type)                      \
    void delete_ ## type ## _(int handle);                  \
    void delete_ ## type(int handle);                   \
    _Pragma( STRINGIFY( weak delete_ ## type ## _ = delete_ ## type) )
DEFINE_DELETE_OBJECT(foo);

gcc -E与えるとき

void delete_foo_(int handle); void delete_foo(int handle);
#pragma weak delete_foo_ = delete_foo
 ;
于 2010-06-12T22:22:28.407 に答える
5

_Pragma("argument") でできる良いことの 1 つは、次のようなコンパイラの問題に対処するために使用することです。

#ifdef _MSC_VER
#define DUMMY_PRAGMA _Pragma("argument")
#else
#define DUMMY_PRAGMA _Pragma("alt argument")
#endif
于 2012-02-28T15:34:32.760 に答える
0

いいえ、移植可能な方法はありません。繰り返しになりますが、#pragma を使用する移植可能な方法はまったくありません。このため、多くの C/C++ コンパイラは、プラグマのような処理を行う独自のメソッドを定義しており、多くの場合マクロに埋め込むことができますが、コンパイラごとに異なるマクロ定義が必要です。あなたがその道を行くつもりなら、あなたはしばしば次のようなことをすることになります:

#if defined(COMPILER_GCC)
#define Weak_b
#define Weak_e __attribute__((weak))
#elif defined(COMPILER_FOO)
#define Weak_b __Is_Weak
#define Weak_e
#endif

#define DEFINE_DELETE_OBJECT(type)                      \
    Weak_b void delete_ ## type_(int handle) Weak_e;    \
    Weak_b void delete_ ## type(int handle)  Weak_e;    

Weak_bGCCのようWeak_eな一部のコンパイラは属性を型シグネチャの補遺として追加し、MSC のような一部のコンパイラはそれをプレフィックスとして追加するため (または少なくとも追加したため)かつて、私が MSC を使用してから何年も経ちました)。ブラケット構造を使用すると、型シグネチャ全体をコンパイラ構造に渡す必要がある場合でも、常に機能するものを定義できます。

もちろん、これを必要な属性なしでコンパイラに移植しようとすると、マクロを何も展開せず、コードがまだ実行されることを願うしかありません。プラグマを純粋に警告または最適化する場合、これは可能性があります。他の場合では、それほど多くはありません。

ああ、実際には Weak_b と Weak_e をパラメーターを取るマクロとして定義する必要があると思いますが、この例のためだけに弱い定義を作成する方法についてドキュメントを読み通すつもりはありませんでした。それは読者の練習問題として残しておきます。

于 2010-06-12T22:12:59.493 に答える
-3

プラグマステートメントを他のステートメントと一緒にマクロに埋め込む方法はありますか?

いいえ、プリプロセッサステートメントをプリプロセッサステートメントに入れることはできません。ただし、それを関数に入れることはできinlineます。Cしかし、それはタグを打ち負かします。

于 2010-06-12T21:32:56.730 に答える