Non, il n'y a pas de moyen portable de faire cela. Là encore, il n'y a aucun moyen portable d'utiliser #pragma. Pour cette raison, de nombreux compilateurs C / C ++ définissent leurs propres méthodes pour faire des choses de type pragma, et ils peuvent souvent être intégrés dans des macros, mais vous avez besoin d'une définition de macro différente sur chaque compilateur. Si vous êtes prêt à suivre cette voie, vous finissez souvent par faire des choses comme celle-ci:
#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ù ce n'est pas évident, vous voulez définir Weak_b
et Weak_e
comme constructions de bracketing de début et de fin parce que certains compilateurs comme GCC ajoutent les attributs comme un addendum à une signature de type, et certains, comme MSC, l'ajoutent comme préfixe (ou du moins il l'a fait une fois, cela fait des années que j'ai utilisé MSC). Avoir des structures de bracketing vous permet de définir quelque chose qui fonctionne toujours, même si vous devez passer la signature de type entière dans une construction de compilateur.
Bien sûr, si vous essayez de porter ceci à un compilateur sans les attributs que vous voulez, vous ne pouvez rien faire d'autre que de laisser les macros se développer à rien et espérer que votre code fonctionne toujours. En cas de pragmas purement d'avertissement ou d'optimisation, cela est probable. Dans d'autres cas, pas tellement.
Oh, et je suppose que vous auriez en fait besoin de définir Weak_b et Weak_e comme des macros qui prennent des paramètres, mais je n'étais pas disposé à lire la documentation pour savoir comment créer une définition faible juste pour cet exemple. Je laisse cela comme un exercice pour le lecteur.