Existe-t-il un moyen d'intégrer une instruction pragma dans une macro avec d'autres instructions?
J'essaye de réaliser quelque chose comme:
#define DEFINE_DELETE_OBJECT(type) \
void delete_ ## type_(int handle); \
void delete_ ## type(int handle); \
#pragma weak delete_ ## type_ = delete_ ## type
Je suis d'accord avec les solutions de boost (sauf pour la vague) s'il en existe.
c-preprocessor
pragma
stringification
Anycorn
la source
la source
Réponses:
Si vous utilisez c99 ou c ++ 0x, il y a l'opérateur pragma, utilisé comme
ce qui équivaut à
sauf qu'il peut être utilisé dans les macros (voir section 6.10.9 du standard c99, ou 16.9 du projet final du comité c ++ 0x)
Par exemple,
quand mis en
gcc -E
donnela source
__pragma()
opérateur de préprocesseur, qui est malheureusement légèrement différent de l'_Pragma()
opérateur de C99 (C99 prend une chaîne littérale, MSVC prend des jetons qui ne sont pas dans une chaîne): msdn.microsoft.com/en-us/library/d9x1s805 .aspxUne bonne chose que vous pouvez faire avec _Pragma ("argument") est de l'utiliser pour résoudre certains problèmes du compilateur tels que
la source
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:
Dans le cas où ce n'est pas évident, vous voulez définir
Weak_b
etWeak_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.
la source
Non, vous ne pouvez pas placer d'instructions de préprocesseur dans des instructions de préprocesseur. Vous pouvez cependant le mettre dans une
inline
fonction. Cela bat leC
tag, cependant.la source
inline
, et la plupart des implémentations majeures de C89 ont quelques variations.inline
va de même pour une autre chose que C a empruntée à C ++!:)