2010-04-28 6 views
4

Est-ce que quelqu'un peut expliquer pourquoi ce qui suit ne fonctionne pas? Je pensais que le prétraitement avait été effectué dans une phase de traduction antérieure à celle des opérations littérales de chaîne et de la traduction générale des jetons.C++ Translation Phase Confusion

Ne serait-le compilateur plus ou moins voir ceci:

int main() 
{ 
    const wchar_t* const foo = L"bar"; 
} 

Ce serait formidable si quelqu'un pouvait citer une explication de la norme.

Répondre

6

Utilisation:

#define FOO L\ 

sans \ arrière, il y aura un espace entre L et la chaîne sur la substitution de macro. Ceci est du résultat de g++ -E:

const wchar_t* const foo = L "bar"; 
+0

Bien sûr! Merci. Doit avoir effectivement regardé la sortie prétraite ... – blakecl

+2

Veillez à laisser une ligne vide entre cette définition et la ligne suivante, sinon la macro sera poursuivie. Je l'ai utilisé plusieurs fois dans le passé pour créer des macros multilignes. –

+1

Notez que cela ne fonctionnera pas sur un préprocesseur conforme car un préprocesseur conforme est basé sur un jeton. La seule façon de combiner deux jetons en un (par exemple, un 'L' et un' 'bar'') est d'utiliser l'opérateur de concaténation ('##'), qui ne peut pas apparaître comme le dernier jeton d'une liste de remplacement. –

0

Le message d'erreur que vous obtenez signifie qu'il est votre pré-traitement #define avant qu'il ne toute autre chose, il ne sait tout simplement pas ce qu'il finit par un sens (après avoir remplacé tous les FOO s avec L s, il recherche ce L signifie et ne peut pas le comprendre).

Le compilateur voit votre deuxième bit de code, il ne sait pas ce que signifie L"bar" à ce stade. Etes-vous sûr que tout est défini et inclus correctement?

0

Regardez la sortie du préprocesseur (g ++ -E)

# 1 "ttt.cc" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "ttt.cc" 
int main() 
{ 

    const wchar_t *const foo = L "FOO"; 
} 

Il y a un espace après votre L.

1

Comme alternative à la réponse de John, je pense que vous pouvez définir ce la façon de _T de Microsoft() est défini:

#define FOO(x)  L ## x 

et l'utiliser comme ceci:

FOO("bar") 

Cela va concaténer le L avec le texte de façon appropriée.

+0

Merci, je sais à ce sujet. J'utilise déjà _T (et mes amis), j'ai juste trébuché sur ce "problème" quand je déconnais du code. – blakecl