Question

Je vais avoir une macro comme celle-ci (pas exactement, mais la fonction est assez équivalente):

#define STRUCTMEMBER(Member,Value) GlobalStructInstance. ## Member = Value
...
STRUCTMEMBER(Item,1);

Cela fonctionne parfaitement dans Visual C ++, mais gcc 3.4.5 (MingGW) génère l'erreur suivante:

  

coller ". " et " Article " ne donne pas de jeton de prétraitement valide

Ceci se produit également lorsque j'utilise le " - > " opérateur. Je n'ai pas trouvé d'indications sur la concaténation, à savoir que l'utilisation de ces opérateurs est interdite.

Quelqu'un a-t-il une idée?

Était-ce utile?

La solution

Peut-être que Visual C ++ est en train de coller deux espaces ensemble pour créer un autre espace. Non pas que les espaces soient des jetons, mais cela permettrait à votre code de fonctionner.

object.member n'est pas un jeton, c'est trois jetons. Vous n'avez donc pas besoin de coller des jetons pour implémenter la macro que vous décrivez. Supprimez simplement le '##' et cela devrait fonctionner partout.

[Edit: juste coché, et le résultat de l'utilisation de ## pour former quelque chose qui n'est pas un jeton valide est indéfini. Donc, GCC est autorisé à le rejeter et MSVC est autorisé à l'ignorer et à ne pas coller, pour autant que je sache.]

Autres conseils

Selon la norme C, le résultat de l'opérateur de prétraitement ' ## ' doit être un 'jeton de prétraitement' ou le résultat n'est pas défini (C99 6.10.3.3 (3) - Le ## opérateur).

La liste des jetons de prétraitement est la suivante (C99 6.4 (3) - Éléments lexicaux):

  

noms d'en-tête, identifiants, numéros de prétraitement, constantes de caractère, littéraux de chaîne, ponctuateurs et simples caractères non blancs qui ne correspondent pas de manière lexicale aux autres catégories de jetons de prétraitement.

GCC vous informe que vous entrez dans un territoire non défini. MSVC est silencieusement satisfait du résultat non défini (c'est ce à quoi vous vous attendriez à peu près qu'il se produise).

Notez que si vous ne créez de toute façon pas un seul jeton, vous n'avez pas besoin de l'opérateur de collage de jetons. En règle générale (je suis sûr qu’il existe probablement une ou deux exceptions), 2 jetons séparés par des espaces blancs équivalent à 2 jetons non séparés par des espaces blancs - comme dans votre exemple.

Extrait de la Documents préprocesseurs gcc c :

  

Cependant, deux jetons qui ne forment pas ensemble un jeton valide ne peuvent pas être collés ensemble.

structure.membre n'est pas un simple jeton.

Dans ce cas, vous n'avez pas besoin d'utiliser l'opérateur ## (concaténation de jetons). Vous pouvez simplement l'enlever. Voici un exemple testé avec gcc 4.2.4 sur linux:

#include <stdio.h>

#define STRUCTMEMBER(Member, Value) GlobalStructInstance.Member = Value

struct {
    const char* member1;
}GlobalStructInstance;

int main(void)
{

    STRUCTMEMBER(member1, "Hello!");

    printf("GlobalStructInstance.member1 = %s\n",
           GlobalStructInstance.member1);

    return 0;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top