发布时间:2022-08-09 文章分类:编程知识 投稿人:赵颖 字号: 默认 | | 超大 打印
如何输出_tmain中的argv[]

如何输出_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如何输出_tmain中的argv[]  悲情土仔一生  C++博客#include"stdafx.h"
2如何输出_tmain中的argv[]  悲情土仔一生  C++博客
3如何输出_tmain中的argv[]  悲情土仔一生  C++博客int_tmain(intargc,_TCHAR*argv[])
4如何输出_tmain中的argv[]  悲情土仔一生  C++博客如何输出_tmain中的argv[]  悲情土仔一生  C++博客如何输出_tmain中的argv[]  悲情土仔一生  C++博客{
5如何输出_tmain中的argv[]  悲情土仔一生  C++博客
6如何输出_tmain中的argv[]  悲情土仔一生  C++博客return0;
7如何输出_tmain中的argv[]  悲情土仔一生  C++博客
8如何输出_tmain中的argv[]  悲情土仔一生  C++博客}

9如何输出_tmain中的argv[]  悲情土仔一生  C++博客

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

1如何输出_tmain中的argv[]  悲情土仔一生  C++博客#include"stdafx.h"
2如何输出_tmain中的argv[]  悲情土仔一生  C++博客
3如何输出_tmain中的argv[]  悲情土仔一生  C++博客usingnamespacestd;//必须在stdafx.h增加#include<iostream>
4如何输出_tmain中的argv[]  悲情土仔一生  C++博客
5如何输出_tmain中的argv[]  悲情土仔一生  C++博客int_tmain(intargc,_TCHAR*argv[])
6如何输出_tmain中的argv[]  悲情土仔一生  C++博客如何输出_tmain中的argv[]  悲情土仔一生  C++博客如何输出_tmain中的argv[]  悲情土仔一生  C++博客{
7如何输出_tmain中的argv[]  悲情土仔一生  C++博客cout<<argc<<endl;
8如何输出_tmain中的argv[]  悲情土仔一生  C++博客cout<<argv[0]<<endl;
9如何输出_tmain中的argv[]  悲情土仔一生  C++博客return0;
10如何输出_tmain中的argv[]  悲情土仔一生  C++博客}

11如何输出_tmain中的argv[]  悲情土仔一生  C++博客

运行结果竟然是这样的:

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

1

003A5210

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

如果把_tmain函数变为:

1如何输出_tmain中的argv[]  悲情土仔一生  C++博客intmain(intargc,char*argv[])
2如何输出_tmain中的argv[]  悲情土仔一生  C++博客如何输出_tmain中的argv[]  悲情土仔一生  C++博客如何输出_tmain中的argv[]  悲情土仔一生  C++博客{
3如何输出_tmain中的argv[]  悲情土仔一生  C++博客cout<<argc<<endl;
4如何输出_tmain中的argv[]  悲情土仔一生  C++博客cout<<argv[0]<<endl;
5如何输出_tmain中的argv[]  悲情土仔一生  C++博客return0;
6如何输出_tmain中的argv[]  悲情土仔一生  C++博客}

7如何输出_tmain中的argv[]  悲情土仔一生  C++博客

运行结果正常:

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”在前面啊!如何输出_tmain中的argv[]  悲情土仔一生  C++博客

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

1如何输出_tmain中的argv[]  悲情土仔一生  C++博客#include"stdafx.h"
2如何输出_tmain中的argv[]  悲情土仔一生  C++博客
3如何输出_tmain中的argv[]  悲情土仔一生  C++博客usingnamespacestd;
4如何输出_tmain中的argv[]  悲情土仔一生  C++博客
5如何输出_tmain中的argv[]  悲情土仔一生  C++博客int_tmain(intargc,_TCHAR*argv[])
6如何输出_tmain中的argv[]  悲情土仔一生  C++博客如何输出_tmain中的argv[]  悲情土仔一生  C++博客如何输出_tmain中的argv[]  悲情土仔一生  C++博客{
7如何输出_tmain中的argv[]  悲情土仔一生  C++博客wcout<<argc<<endl;
8如何输出_tmain中的argv[]  悲情土仔一生  C++博客wcout<<argv[0]<<endl;
9如何输出_tmain中的argv[]  悲情土仔一生  C++博客return0;
10如何输出_tmain中的argv[]  悲情土仔一生  C++博客}

11如何输出_tmain中的argv[]  悲情土仔一生  C++博客

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

(比如这样的定义:)

1如何输出_tmain中的argv[]  悲情土仔一生  C++博客#ifdef_UNICODE
2如何输出_tmain中的argv[]  悲情土仔一生  C++博客#define_tmainwmain
3如何输出_tmain中的argv[]  悲情土仔一生  C++博客#define_tWinMainwWinMain
4如何输出_tmain中的argv[]  悲情土仔一生  C++博客#else
5如何输出_tmain中的argv[]  悲情土仔一生  C++博客#define_tmainmain
6如何输出_tmain中的argv[]  悲情土仔一生  C++博客#define_tWinMainWinMain
7如何输出_tmain中的argv[]  悲情土仔一生  C++博客#endif

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