argv[0]
始终是可执行文件的名称。(这意味着argc > 0
总是如此。)如果你想输出宽字符(我认为_TCHAR
映射到wchar_t
BICBWT),你不能使用窄输出。在 C++ 中,输出是使用输出流完成的。宽控制台输出流是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;
}
正如 Rup 提到的,根据某些定义_TCHAR
更改其值(char
或)。wchar_t
首先也是最重要的:你真的需要这种转换吗?在实践中,当您需要宽字符时,大多数情况下您确实需要它们,并且程序无法正确处理窄字符。
所以很可能你可以只使用纯宽字符,摆脱切换,并使用上面编写的代码。
但是,如果你真的需要切换,你需要自己在窄和宽控制台流之间切换。(这仅适用于控制台流对象,顺便说一句。对于您自己的流,例如文件流,您可以只使用_TCHAR
并让编译器找出其余的: std::basic_ofstream<_TCHAR>
。)做到这一点的一种方法是特征班级:
//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;
这样,上面函数中的循环output()
将变为:
while(begin != end)
my_cout << *begin++ << _T('\n');