argv[0]
est toujours le nom de l'exécutable. (Ce qui signifie que argc > 0
est toujours vrai.) Si vous voulez afficher des caractères larges (je pense que _TCHAR
correspond à wchar_t
, BICBWT), vous ne devez pas utiliser une sortie étroite. En C++, la sortie est effectuée en utilisant des flux de sortie. Le flux de sortie de la large console est std::wcout
.
#include <iostream>
//Beware, brain-compiled code ahead!
template< typename InpIt >
void output(InpIt begin, InpIt end)
{
while(begin != end)
std::wcout << *begin++ << L'\n';
}
int _tmain(int argc, _TCHAR* argv[])
{
std::wcout << L"num arguments: " << std::argc << L'\n';
output(argv+1, argv+argc)
return 0;
}
Comme mentionne Rup, _TCHAR
change sa valeur (ou char
wchar_t
) selon une définition. D'abord et avant tout: Avez-vous vraiment besoin de cette commutation? En pratique, lorsque vous avez besoin de caractères larges, le plus souvent vous en avez vraiment besoin et le programme ne fonctionnera pas correctement avec des caractères étroits.
Il est donc très probable que vous pouvez simplement vous contenter de caractères larges purs, vous débarrasser de la commutation, et utiliser le code ci-dessus comme écrit. Toutefois, si vous avez vraiment besoin de basculer, vous devez basculer entre les flux de console étroits et larges vous-même. (Ceci n'est vrai que pour les objets de flux de la console, BTW Pour vos propres flux, disons, par exemple, les flux de fichiers, vous pouvez simplement utiliser _TCHAR
et laisser le compilateur comprendre le reste: std::basic_ofstream<_TCHAR>
.) Une façon de le faire serait traits classe:
//Beware, brain-compiled code ahead!
template< typename Char >
struct console_stream_traits; // leave undefined
template<>
struct console_stream_traits<char> {
typedef std::basic_ostream<char> ostream;
typedef std::basic_istream<char> istream;
std::basic_ostream<char>& cout = std::cout;
std::basic_ostream<char>& cerr = std::cerr;
std::basic_ostream<char>& clog = std::clog;
std::basic_istream<char>& cin = std::cin;
};
template<>
struct console_stream_traits<wchar_t> {
typedef std::basic_ostream<wchar_> ostream;
typedef std::basic_istream<wchar_> istream;
std::basic_ostream<wchar_t>& cout = std::wcout;
std::basic_ostream<wchar_t>& cerr = std::wcerr;
std::basic_ostream<wchar_t>& clog = std::wclog;
std::basic_istream<wchar_t>& cin = std::wcin;
};
typedef console_stream_traits<_TCHAR> my_ostream;
typedef my_console_stream_traits::ostream my_ostream;
typedef my_console_stream_traits::ostream my_ostream;
my_ostream& my_cout = my_console_stream_traits::cout;
my_ostream& my_cerr = my_console_stream_traits::cerr;
my_ostream& my_clog = my_console_stream_traits::clog;
my_istream& my_cin = my_console_stream_traits::cin;
Avec cela, la boucle dans la fonction output()
ci-dessus deviendrait:
while(begin != end)
my_cout << *begin++ << _T('\n');
utilisation wcout, wprintf, etc. Vous exécutez un système d'exploitation Unicode, pas besoin de faire le non-sens de _t. –