• 第一次课


    自定义别名

    CUI程序 GUI程序

    SAL 语法, 主要是出参, 入参

    #define BYTE  char*
    BYTE a, b; // a是char *, b是char类型
    
    typedef  char* BYTE;
    BYTE a, b;	// a, b都是char*类型
    
    typedef unsigned short WORD;
    
    typedef unsigned int DWORD; 
    
    typedef DWORD* PDWORD;	// 短指针
    
    typedef PDWORD LPWORD;	// 长指针, 现在短指针没区别, 为了兼容性, 除此之外还有近指针, 远指针
    
    typedef void* PVOID; 
    

    linux所有资源可抽象为file descriptor(fd), 文件句柄

    windows所有资源可抽象为HANDLE, 指向内存中的对象

    typedef int HANDLE;
    
    typedef HANDLE HMODULE;
    
    typedef HANDLE  HINSTANCE;
    
    typedef SYSTEMTIME* PSYSTEMTIME;
    typedef PSYSTEMTIME LPSYSTEMTIME;
    

    字符集处理

    字符串定义类型

    typedef char* PSTR;
    typedef PSTR LPSTR;
    
    typedef const char* PCSTR;
    typedef PCSTR LPCSTR;
    
    typedef unsigned short wchar_t;		// 两个字节的char, 宽字符
    typedef wchar_t* PWSTR;
    typedef PWSTR LPWSTR;
    
    typedef const wchar_t* PCWSTR;
    typedef PCWSTR LPCWSTR;
    
    typedef wchar_t WCHAR;			// 微软单独给wchar_t起个别名 
    
    char a = 'A';			// 没问题
    char a = '张';			// 存取上可能有乱码
    wchar_t a = L'张';				// unicode编码, 两个字节
    const wchar_t pstr = L"asdf"; 	// 引号前+L, 这样每个字母占两个字节, 
    // 有的函数要传入宽字符字符串, 这时可在字符前加L, 例如CreateProcess(), 第一个字符是宽字符
    

    windows上其实不存在CreateProcess, 这是一个宏, 会根据字符集类型展开, 可在工程里设置字符集, 默认unicode

    通过宏定义来指定自定义类型指向字符集

    #ifdef UNICODE
    #define CreateProcess  CreateProcessW
    #else
    #define CreateProcess  CreateProcessA
    #endif // !UNICODE
    
    #ifdef UNICODE
    #define PCTSTR  PCWSTR
    #else
    #define PCTSTR  PCSTR
    #endif // !UNICODE
    
    #ifdef UNICODE
    #define PTSTR  PWSTR
    #else
    #define PTSTR  PSTR
    #endif // !UNICODE
    
    
    #ifdef UNICODE
    #define TCHAR  wchar_t
    #else
    #define TCHAR  char
    #endif // !UNICODE
    
    // TCHAR* 等同于 PTSTR 
    // 定义UNICODE宏时等同于PWSTR
    // 没定义UNICODE宏时等同PSTR
    

    包装

    #ifdef UNICODE
    #define TEXT(x) L##x    // C语言语法, 意思是把它两个连接在一起
    #else
    #define TEXT(x) x
    #endif
    
    #define _T(x) TEXT(x)   // 对TEXT进一步进行包装
    
    CreateProcess(_T("HelloWorld"), L"haha");		// 推荐使用包裹性, 而不是直接在字符串前放L, 这样可以根据字符集进行切换
    CreateProcess(TEXT("HelloWorld"), L"haha");
    

    使用CreateProcessA时, 操作系统会把字符显示转换为宽字符, 然后再调用CreateProcessW, 为了效率使用CreateProcessW

    #ifdef UNICODE
    #define _tcslen  wcslen
    #else
    #define _tcslen  strlen
    #endif // !UNICODE
    
    #ifdef UNICODE
    #define tstring std::wstring 
    #else
    #define tstring std::string
    #endif // !UNICODE
    

    这样使用tstring兼容两个字符集

    atoi("88") = 88;

    界面上如果是宽字符则是atoi(L"88"), 这时这个函数失效, 应使用_wtoi(L"88")

    _tstoi(_T("88"))这么使用则可以根据字符集动态的转换

    vs快捷键

    Ctrl + K + FVS 格式化代码的快捷键

    CTR + SHIFT + SPACE 函数提示

  • 相关阅读:
    Linux安装oracle 10g常见问题之——ORA-01078,LRM-00109,ORA-01102
    Linux安装oracle 10g常见问题之——OUI-25031
    C#中static静态变量的用法
    让DIV中的内容水平和垂直居中
    json对象与json字符串互换
    AJAX请求 $.post方法的使用
    .NET(c#)new关键字的三种用法
    创建数据库和表的SQL语句
    SQL、LINQ、Lambda 三种用法(转)
    AJAX中UPDATEPANEL配合TIMER控件实现局部无刷新
  • 原文地址:https://www.cnblogs.com/hesper/p/10597253.html
Copyright © 2020-2023  润新知