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