Erreurs à l'aide de TCHAR,ne peut pas convertir à wchar_t
J'ai été invité à ajouter des fonctionnalités à un vieux projet mais je n'arrive pas à construire.
Il gère des chaînes unicode, mais je reçois beaucoup d'erreurs concernant l'utilisation de TCHAR.Spécifiquement presque chaque erreur est TCHAR ne peuvent pas être convertis ou utilisé comme wchar_t.
De ce que j'ai vu sur beaucoup de différents articles que j'ai essayé d'utiliser #define _UNICODE ou UNICODE #define, mais aucun n'a résolu le problème.
Voici un bout du code:
#include <windows.h>
#include <wininet.h>
#include <tchar.h>
#include <iostream>
#include <fstream>
#include <strsafe.h>
#include <string>
#include <list>
#include <cctype>
#include <winnt.h>
#include <atlconv.h>
#pragma comment(lib,"wininet.lib")
using namespace std;
TCHAR *tags[] = { _T("aa"), _T("bb"), _T("cc"),
NULL };
int _tmain(int argc, _TCHAR* argv[])
{
int i = 0;
for (i = 1; i<argc; i++) {
if (wcscmp(argv[i], _T("-h")) == 0) {
...
}
else if (wcscmp(argv[i], _T("-f")) == 0) {
...
}
...
}
Dans les lignes ci-dessus par exemple,lors de l'utilisation de wcscmp, je reçois
argument of type "_TCHAR *" is incompatible with parameter of type "const wchar_t *"
concernant la argv[i]
et
argument of type "const char *" is incompatible with parameter of type "const wchar_t *"
concernant la _T ("h").
Toute suggestion serait vraiment apprécié.
Vous devez vous connecter pour publier un commentaire.
Le code a été écrit pour cible Unicode plutôt que MBCS. Cela peut être discerné par l'utilisation de
wcscmp
qui accepte des paramètres de typeconst wchar_t*
.D'autre part, il y a des parties du code qui utilisent
TCHAR
et liées à des macros. Maintenant,TCHAR
est une macro qui se résout soitchar
ouwchar_t
selon si oui ou non_UNICODE
ou_MBCS
sont définis. Consulter le la documentation pour plus de détails.L'utilisation de
TCHAR
provient de l'époque où les développeurs souhaitent écrire du code pour Windows NT/2000 (qui a pris en charge les deux ANSI et Unicode (Api), et Windows 95/98 (qui a seulement ANSI, Api). L'utilisation deTCHAR
permis une base de code commune. Compiler avec_UNICODE
défini pour NT/2000, et de compiler avec_MBCS
définis pour 95/98.Si vous le code dans ce style, vous écrivez
_tcscmp
plutôt quewcscmp
. Pour une version Unicode il résoutwcscmp
, et pour un MBCS construire, il décide de_mbscmp
.Ces jours, vous n'avez généralement pas besoin d'écrire du code pour soutenir 95/98. Vous pouvez probablement choisir d'ignorer ces plates-formes. Dans ce cas, vous devriez cible Unicode et cesser d'utiliser
TCHAR
et liées à des macros. Remplacer_T("..")
avecL".."
. Remplacertmain
avecwmain
. RemplacerTCHAR
avecwchar_t
. Et ainsi de suite.Vous n'avez pas besoin de faire ces changements. Vous pourriez tout simplement la cible Unicode et votre code ne compile. Cependant, la
TCHAR
idiome a été appliqué de façon uniforme dans votre base de code. Notez l'utilisation de_tmain
,TCHAR
, mais aussi les appels àwcscmp
. Si votre code ne peut pas compiler, sauf si elle vise Unicode. Ainsi, vous ne perdez rien en abandonnantTCHAR
. Ce que vous gagnez, c'est la clarté. Vous arrivez à arrêter l'utilisation de ces macros et d'éviter tous les obscurcissement qu'ils fournissent. L'Indirection est un excellent outil, mais si il n'est pas nécessaire, alors il a simplement conduit à la confusion et de l'obscurcissement.Il semble que vous n'êtes pas la construction de votre application pour l'Unicode, afin de vérifier les paramètres de votre projet.
Si vous êtes à l'aide de la grande chaîne des fonctions comme
wcscmp
alors il n'y a pas de point à l'aide de la_T()
macro en tant que votre échoue à compiler, lors de la compilation dans la non-Unicode mode. Si vous voulez le code à compiler dans les deux modes lorsque vous avez besoin d'utiliser leTCHAR
conscient fonctions dans<tchar.h>
comme _tcscmp .Si vous voulez toujours une chaîne à l'échelle de passer une
L
à la à partir, par exemple,L"Hello, world"
TCHAR
idiome qui a été utilisé de façon uniforme.Si vous utilisez Visual Studio, ensemble Jeu de Caractères à Utiliser Jeu de Caractères Unicode dans le cadre du projet Propriétés de Configuration.
Je pense que vous pouvez utiliser #define UNICODE, mais assurez-vous de le faire avant tout inclut.