いいえ、それを行うポータブルな方法はありません。繰り返しになりますが、#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;
GCCのような一部のコンパイラは型シグネチャに補遺として属性を追加し、MSCのようにプレフィックスとして追加するためWeak_b
、Weak_e
開始および終了のブラケット構造として定義したい場合は、明白ではありません(または少なくともそうしました)かつて、MSCを使用してから数年になります)。ブラケット構造を使用すると、型シグネチャ全体をコンパイラ構造に渡す必要がある場合でも、常に機能するものを定義できます。
もちろん、必要な属性なしでこれをコンパイラに移植しようとした場合、できることは何もありませんが、マクロを何も展開せずに、コードが引き続き実行されることを望みます。純粋に警告または最適化プラグマの場合、これは可能性が高いです。他の場合では、それほどではありません。
ああ、私はあなたが実際にWeak_bとWeak_eをパラメーターを取るマクロとして定義する必要があると思うが、私はこの例のためだけに弱い定義を作成する方法についてのドキュメントを読みたくなかった。読者の練習問題として残しておきます。