悲情土仔一生

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  14 随笔 :: 0 文章 :: 74 评论 :: 0 Trackbacks

如何输出_tmain中的argv[]


作者:Tuuzed(土仔)  
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.cppblog.com/tuuzed/archive/2008/02/23/43153.html



    使用过VS2005中VC++的大侠们应该对_tmain不陌生。是的,_tmain是Microsoft自己弄出来的东西,关于它的问题网上有一堆(GOOGLE Search)。今天想用VS2005中的VC++做一个WIN32控制台(console)下的应用程序,向导程序默认给出的是以下内容:

 

1#include "stdafx.h"
2
3int _tmain(int argc, _TCHAR* argv[])
4{
5
6    return 0;
7
8}

9

想当然,很好,很容易。试试列出命令的参数:

 1#include "stdafx.h"
 2
 3using namespace std; //必须在stdafx.h增加#include <iostream>
 4
 5int _tmain(int argc, _TCHAR* argv[])
 6{
 7    cout << argc <<endl;
 8    cout << argv[0<<endl;
 9    return 0;
10}

11

运行结果竟然是这样的:

D:\MyData\CSharp\Projects\test\Debug>test

1

003A5210

003A5210”是什么值?一开始就弄不懂了。

如果把_tmain函数变为:

1int main(int argc, char* argv[])
2{
3    cout << argc <<endl;
4    cout << argv[0<<endl;
5    return 0;
6}

7

运行结果正常:

D:\MyData\CSharp\Projects\test\Debug>test

1

d:\MyData\CSharp\Projects\test\Debug\test.exe

头大了。最后分别对两个函数运用断点中的反汇编看看,发现原来**argv竟然是wchar_t**,再翻弄了一下_TCHAR的声明:typedef wchar_t     _TCHAR;
一切明白了。要输出这个_TCHAR只能用cout的另一个版本:wcout。
为什么呢?原因很简单,因为他们都带了一个“w”在前面啊!

能正确输出_TCHAR* argv[]的版本:

 1#include "stdafx.h"
 2
 3using namespace std;
 4
 5int _tmain(int argc, _TCHAR* argv[])
 6{
 7    wcout << argc <<endl;
 8    wcout << argv[0<<endl;
 9    return 0;
10}

11




给出一个网上对_tmain的一个有用的定义:
   
对于ANSI版本,"_tWinMain"就是"WinMain";对于UINCODE版本,"_tWinMain"就是"wWinMain"。  

  (比如这样的定义:)  

1  #ifdef   _UNICODE   
2  #define   _tmain   wmain   
3  #define   _tWinMain   wWinMain   
4  #else   
5  #define   _tmain   main   
6  #define   _tWinMain   WinMain   
7  #endif 

    所以,_tmain()不过是unicode版本的的main() 

posted on 2008-02-23 22:53 土仔 阅读(5921) 评论(9)  编辑 收藏 引用 所属分类: 土仔编程

评论

# re: 如何输出_tmain中的argv[] 2008-02-24 13:32 @Zeus
博主尝试用_tprintf呢  回复  更多评论
  

# re: 如何输出_tmain中的argv[] 2008-02-24 16:13 Javen
所有的字符串处理函数都有宽字符版和窄字符版
MS使用_t前缀的函数目的就在于期望使用一种统一写法可以方便地在宽字符版本和窄字符版本函数间快速地替换。所有的_t前缀函数都是宏定义,MS根据你的预定义,预编译时将之替换成实际的函数。
所以,如果你用_tmain函数的话,后面的字符处理函数也尽量写成_t系列的  回复  更多评论
  

# re: 如何输出_tmain中的argv[] 2008-02-24 22:01 土仔
@@Zeus
是的。如果用_tprintf就没有问题了。  回复  更多评论
  

# re: 如何输出_tmain中的argv[] 2008-02-24 22:03 土仔
@Javen
确实没错。只是,我是第一次接触这个_tmain。写下这个的目的是留下一个解决的思路,越往下,了解得就越多了哈。  回复  更多评论
  

# re: 如何输出_tmain中的argv[] 2008-02-25 12:07 新魔界私服
牛B  回复  更多评论
  

# re: 如何输出_tmain中的argv[] 2008-02-25 14:08 aGAric
VS2005默認是Unicode工程.  回复  更多评论
  

# re: 如何输出_tmain中的argv[] 2008-12-15 15:38 莫耶
有帮助~  回复  更多评论
  

# re: 如何输出_tmain中的argv[][未登录] 2009-04-24 15:52 Max
Javen说的比较全面。

我最近也遇到这个类似问题,请问如何改变这个缺省UNICODE设置,改为ANSI
Coding?

谢谢!  回复  更多评论
  

# re: 如何输出_tmain中的argv[][未登录] 2009-04-24 15:58 Max
从前从未跟UNICODE打过交道,我的项目也总是缺省按单字节编码的模式运作,
只是这回突然出现问题,有点晕。:-)  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理