2010-09-03 9 views
0

Dans un projet, je dois définir "Utiliser le jeu de caractères Unicode" pour Propriétés de configuration> Général> Jeu de caractères.Utilisation du jeu de caractères Unicode dans les paramètres du projet VS 2008

sur la compilation du projet, l'erreur C2664 est retourné sur ce code:

char Filename[25] = {0}; 
GetLocalTime(&st); 
sprintf(Filename,TEXT("C:\\CpmMicr%02d%02d%04d.log"), st.wDay,st.wMonth,st.wYear); 

Lorsque je change la configuration du jeu de caractères à « Non défini » ou projet « caractère multi-octets » compile sans erreur .

S'il vous plaît me suggérer sur ce qui devrait être fait pour résoudre ce problème.

Merci pour toute suggestion éventuelle.

Lakshmi.

Répondre

1

C'est parce que vous utilisez la macro TEXT. Cela met automatiquement un L avant un littéral de chaîne si vous compilez avec _UNICODE défini. Cela explose parce que vous utilisez sprintf(), une fonction non-Unicode. Il veut un char *, pas un wchar_t *.

Il existe trois solutions de base ici:

  1. supprimer le texte macro
  2. Utilisez TCHAR et les fonctions de chaîne correspondantes de manière cohérente
  3. Utilisez des déclarations Unicode dans votre code, wchar_t [] et swprintf().

Aucun point réel dans 2, il n'y a pas de système d'exploitation grand public qui n'est pas Unicode natif.

+0

Hi Hans Passant, solution 3 qui était Comme j'ai migré l'ancien projet vers VS2008, il y a beaucoup d'endroits où ce correctif doit être appliqué.Y a-t-il d'autres modifications possibles dans les paramètres du projet qui peuvent produire le même résultat? Lakshmi – Lakshmi

+0

Well , il y a beaucoup de bogues dans votre code s'il utilise TEXT() ou _T() dans les fonctions de la chaîne ansi. Je vais vous en parler. Il n'y a pas de baguette magique pour réparer des bugs comme ça. –

+0

C'est une macro d'une macro. IntelliSense vous montre seulement le premier niveau. Quelle est la pertinence de cela pour votre question? –

1

extrêmement difficile de donner une solution exacte sans code (s'il vous plaît poster la partie pertinente), mais vous essayez probablement d'attribuer un char * à un wchar * ou vice-versa. Par exemple

std::basic_string<wchar_t> someString("test"); //C2664 here 

devrait être

std::basic_string<wchar_t> someString(L"test"); 

modifier: le problème dans votre code est que vous utilisez la macro TEXT ainsi dans une version unicode qui sera un grand char, sprintf prend const char * bien que. Je ne sais pas pourquoi il travaillait dans les versions précédentes de VS? Utilisez wsprintf et modifiez Filename pour avoir un caractère large, ou supprimez la macro TEXT.

+0

ok, .. le compilateur n'ajoute-t-il pas "L" avant "test" quand le jeu de caractères unicode est sélectionné? ci-dessous est le code pour lequel l'erreur c2664 est renvoyée: char Filename [25] = {0}; GetLocalTime (&st); sprintf (Nom de fichier, TEXT ("C: \\ CpmMicr% 02d% 02d% 04d.log"), st.wDay, st.wMonth, st.wYear); – Lakshmi

+0

La suppression de la macro TEXT fonctionne également migrer l'ancien projet vers VS2008, il y a beaucoup d'endroits où cette correction doit être appliquée.Je voudrais savoir si des modifications possibles dans les paramètres du projet pourraient produire le même résultat? – Lakshmi

Questions connexes