J'ai résolu mon problème avec cet extrait de code - mais il fait partie d'un programme plus vaste, donc je ne veux pas d'autre moyen de le faire - J'ai besoin d'un moyen de faire travail!Syntaxe de macros préprocesseur C++ bizarre
Quand je produis un fichier prétraité de ce code:
#define OUTER(a, b) \
a##b
#define INNER(c, d) \
c##d
enum foo {
OUTER(INNER(x, y), z)
}; // line 108
int APIENTRY _tWinMain(...)
{
foo bar = xyz; // line 112
}
je reçois:
enum foo {
xyz
}; // line 108
int __stdcall wWinMain(...)
{
foo bar = xyz; // line 112
}
qui est ce que je veux. Cependant, si je tente de compiler le code que je reçois:
erreur C2146: erreur de syntaxe: manquant '}' avant identifiant 'z' ligne 108
erreur C2143: erreur de syntaxe: manquant ';' avant '}' ligne 108
erreur C2143: erreur de syntaxe: manquant ';' avant '}' ligne 108
erreur C2059: erreur de syntaxe: '}' ligne 108
erreur C2065: 'xyz': ligne d'identification non déclarés 112
Je ne peux pas travailler dehors! Le problème semble être causé par le ##
dans:
#define OUTER(a, b) \
a##b
mais pourquoi (et comment le réparer) est au-delà de moi ...
@Jack Pourriez-vous expliquer ce que ## b est censé faire? Je n'ai jamais vu ça avant. – InsertNickHere
@Insert C'est un opérateur de préprocesseur qui concatène littéralement ses deux arguments. Par exemple, 'OUTER (test, string)' dans l'extrait de code OP est remplacé par 'teststring' par le préprocesseur. –
OK, je peux confirmer que cela se passe aussi dans gcc, et leur erreur est un peu plus descriptive. Il dit qu'il ne peut pas coller ')' et 'z' ensemble. Il me semble que le préprocesseur ne peut pas faire de pâtes imbriquées comme celle-ci, mais c'est une conjecture à ce stade. J'espère que ça aide un peu .. – Blindy