有人说 这是 cout 的问题
- C/C++ code
cout << L"hello world !"<<endl; cout << "hello world !"<<endl;
汇编:
- C/C++ code
cout << L"hello world !"<<endl;0041456E mov esi,esp 00414570 mov eax,dword ptr [__imp_std::endl (41A330h)] 00414575 push eax 00414576 mov edi,esp 00414578 push offset string L"hello world !" (417874h) 0041457D mov ecx,dword ptr [__imp_std::cout (41A334h)] 00414583 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A344h)] 00414589 cmp edi,esp 0041458B call @ILT+430(__RTC_CheckEsp) (4111B3h) 00414590 mov ecx,eax 00414592 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A33Ch)] 00414598 cmp esi,esp 0041459A call @ILT+430(__RTC_CheckEsp) (4111B3h) cout << "hello world !"<<endl;0041459F mov esi,esp 004145A1 mov eax,dword ptr [__imp_std::endl (41A330h)] 004145A6 push eax 004145A7 push offset string "hello world !" (417864h) 004145AC mov ecx,dword ptr [__imp_std::cout (41A334h)] 004145B2 push ecx 004145B3 call std::operator<<<std::char_traits<char> > (411163h) 004145B8 add esp,8 004145BB mov ecx,eax 004145BD call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A33Ch)] 004145C3 cmp esi,esp 004145C5 call @ILT+430(__RTC_CheckEsp) (4111B3h)
输出:
00417847
hello world !
为啥 一个地址,一个字符串?
[解决办法]
cout不支持宽字符
[解决办法]
cout不支持宽字符的输出,输出宽字符用wcout。
[解决办法]
[解决办法]
wcout << L"hello world !"<<endl;
cout << "hello world !"<<endl;
[解决办法]
cout 不支持宽字符.
[解决办法]
cout << "hello world !"<<endl;
编译器将"hello world !"解析为const char*,调用cout的"<<"操作符的operator<<(const char*)版本
cout << L"hello world !"<<endl;
编译器将L"hello world !"解析为const wchar_t*,而cout的"<<"操作符没有operator<<(const wchar_t*)版本,而存在operator<<(const void*)版本,由于const wchar_t*可默认转换为const void*,根据重载规则,编译器会选择operator<<(const void*)版本,而operator<<(const void*)版本的实现是将指针地址值输出到cout