Non, il n'est pas portable façon de le faire. Puis de nouveau, il n'existe pas de portable façons d'utiliser la directive #pragma. De ce fait, de nombreux compilateurs C/C++ définir leurs propres méthodes pour faire pragma-comme des choses, et souvent, ils peuvent être incorporées dans les macros, mais vous avez besoin d'une autre définition de macro sur chaque compilateur. Si vous êtes prêt à aller dans cette voie, vous êtes souvent faire des choses comme ceci:
#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;
Dans le cas où ses pas évident que vous voulez définir en Weak_b
et Weak_e
de début et de fin de bracketing de constructions, car certains compilateurs comme GCC ajouter les attributs d'un addendum à un type de signature, et certains, comme le MSC ajouter un préfixe (ou au moins, il a fait une fois, sa fait des années depuis que je l'ai utilisé MSC). Ayant bracketing contructs vous permet de définir quelque chose qui fonctionne toujours, même si vous avez à passer toute la signature d'un type dans un compilateur de construire.
Bien sûr, si vous essayez de porter ce pour un compilateur sans les attributs que vous voulez, il n'y a rien que vous pouvez faire, mais laisser les macros étendre à rien, et j'espère que votre code s'exécute toujours. En cas de purement avertissement ou de l'optimisation de pragmas, c'est probable. Dans d'autres cas, pas tellement.
Oh, et je suppose que vous auriez besoin de définir Weak_b et Weak_e que des macros qui prennent des paramètres, mais je n'étais pas prêt à lire la documentation pour savoir comment créer une faible définition juste pour cet exemple. Je laisse ça comme un exercice pour le lecteur.