zoukankan      html  css  js  c++  java
  • 关于main与wmain函数

    最近写一个控制台程序,并且希望该控制台程序运行时不显示控制台窗口,于是在程序include语句下面加入如下代码

    #pragma comment (linker,"/subsystem:"windows" /entry:"mainCRTStartup"")

    而原先的控制台程序入口为int wmain(int argc, _TCHAR* argv[]),必须要改为main才能编译通过

    但是问题来了,原来运行没问题的代码,现在出问题了

    if ((argc > 1) && ((*argv[1] == L'-') || (*argv[1] == L'/'))){
            if (__wcsicmp(L"set", argv[1] + 1) == 0){

       }

    }

    通过打印,调试后发现,我在控制台中输入命令***.exe /set,argv[1] + 1 读取到的内容为et,

    而在int wmain(int argc, _TCHAR* argv[])函数中argv[1] + 1 读取到的内容为set。Why?

    后来查了一下这两个函数的区别,发现有如下特点:
      1、main()是WINDOWS的控制台程序(32BIT)或DOS程序(16BIT),   
        2、WinMain()是WINDOWS的GUI程序,   
        3、 wmain()是UNICODE版本的main(),wmain也是main的另一個别名,是为了支持二个字节的语言环境
          4、_tmain()是个宏,如果是UNICODE则他是wmain()否则他是main()
    因此分析,在main(int argc, _TCHAR* argv[])和wmain(int argc, _TCHAR* argv[])两种情况下

    同样输入***.exe /set

    wmain中argv[1] = "/"   ,占两个字节

    main中argv[1] = "/s" ,占两个字节

    argv[1]均是双字节变量,而在wmain入口中,用户的输入字符,每个字符按UNICODE方式存储,

    而在main入口中,用户的输入字符,每个字符按ANSCII方式存储。

    因此修改如下:

    if ((argc > 1) && ((*argv[1] == L'-') || (*argv[1] == L'/'))){
            if (_stricmp("set", argv[1] + 1) == 0){

      }

    }

  • 相关阅读:
    [luogu1594]护卫队(dp)
    [luogu1968]美元汇率(dp)
    [NOIP2006]金明的预算方案(dp)
    [caioj1056](相同数列问题)填满型01背包2
    [IPUOJ]混合背包 (dp)
    趣说倍增算法
    [POI2005]BAN-Bank Notes (dp、倍增)
    NOIP考前注意
    SharePoint 2013 App 开发—Auto Hosted 方式
    SharePoint 2013 App 开发—App开发概述
  • 原文地址:https://www.cnblogs.com/meizixiong/p/3988768.html
Copyright © 2011-2022 走看看