• c++中的一些容易混淆的研究


    (1)、TRUE/FALSE与ture/false以及NULL与null的区别是什么?

    1、首先我们要了解true/false是标准c++中定义的关键字,在c语言中是没有bool类型的。

    所以为了弥补C与C++中环境的差异,使代码方便移植(主要是为了c++编写的代码移植到C环境中),故在标准C++中定义了TRUE/FALSE宏。定义如下:

    #define TRUE  1

    #define FALSE 0

    故TRUE/FALSE是宏(类型为int类型),而ture/false是标准c++的bool类型关键字。

    2、NULL与null的区别看以下定义即可明白。

    #ifndef NULL

    #ifdef __cplusplus // c++平台

    #define NULL 0

    #else

    #define NULL ((void *) 0)     // 需要强制类型转换

    #endif

    #endif

    故在工作中我们尽量用TRUE/FALSE来表示true/false,用NULL来表示null。

    (2)_T("XXXX")与L"XXX"的区别

    一般如果接触过c++的unicode方面的工作,会比较明白它们的区别,其实我们来看下 tchar.h文件中对 _T 这个宏的定义就会明白,大概就是:

    #define _T(x)  __T(x)

    #ifdef  _UNICODE

    #define __T(x)      L ## x

    #else

    #define __T(x)      x

    #endif

    其实就是_T("XXX")是与平台相关的,如果你选择是unicode的编码环境,则表示为UTF-16的字符串,否则是ANSI的字符串格式。

    而L"XXX"表示了它就是UTF-16字符串,与是否是unicode平台是无关的。所以根据具体情况选择合适的表示方式很重要。

    (3)long类型在64位中到底是4个字节还是8个字节?

                       linux64             windows64        linux32         windows32

    char               8                        8                       8                      8

    short            16                      16                     16                    16

    int                32                      32                     32                    32

    long             64                       32                     32                    32 

    long long      64                       64                     64                    64

    size_t           64                      64                     32                     32

    void*            64                      64                     32                     32

    通过上面的表格内容,我们会发现

    1、long类型64位的字节数是和操作系统平台相关的,win中是4个字节,linux中是8个字节

    2、size_t的字节数是和平台的位深相关的,32位是4个字节,64位时8个字节。具体可以看size_t这个宏的定义即可明白。

    3、指针的字节数也和平台的位深相关。

    (4) 多线程中不断的申请Socket的套接字,不断的使用,会使用完,怎么办?

    struct linger linger = {1, 0};
    if(-1 == setsockopt( nSocketAccept, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger) ))
    {
    perror("SO_LINGER 1 Error");
    continue;
    }

    对套接字加上如上语句即可,表示调用此方法closesocket(nSocketAccept)关闭套接字后是立即回收此套接字,不会等待系统时间的释放。

    (5) unicode下c++格式化%S与%s的区别

    如wprintf()与vswprintf()这些格式化方法中%S与%s是存在系统平台的差异的!

    1、windows

    使用%s时,printf是认为输的字符串是字符,而wprintf则认为是字符的

    使用%S时,printf是认为输的字符串为字符,而wprintf则认为是字符的,正好与%s小写的s相反。

    例如:  wprintf(L"%S", "abcd")    输出为abcd。  wprintf(L"%S", L"abcd")  输出是a

        (因为%S格式的wprintf认为输入的字节是单字节,所以把L"abcd"作为单字节的输入了,而本身真实输入的是宽字节的L"abcd",故输出就是a了)。

    2、Linux

    使用%s时,则printf与wprintf都认为输的字符串是字节的。

    使用%S时,则printf与wprintf都认为输的字符串是字节的。

    例如:  wprintf(L"%S", L"abcd") 与 printf(L"%S", L"abcd")都是输出的为abcd。

    好了,是不是觉得linux更对一些呢?天知道,又没有一个标准。

    (6) wchar_t的占几个字节?

    wchar_t的字节大小是与平台相关的。

    Windows下是2个字节(UTF-16)  

    Linux下是4个字节(UTF-32)

    但是Linux可以在使用 gcc 编译程序的时候再后面跟上 -fshort-wchar 来表示wchar_t是UTF-16编码。

    (7)未完待续。。。。

  • 相关阅读:
    瑜伽
    尼姆博弈(Nimm's Game)
    asp.net 自定义控件之ItemTemplate
    Tab控件css样式布局
    css 左右布局一例
    C# HotKey 的另一种方法
    asp.net 自定义tab控件实现
    c# console 程序实现 hot key
    c# console 在非主线程Hot Key
    记录一次sql 更新出现的 “出现不支持的SQL92 标记 :126” 错误
  • 原文地址:https://www.cnblogs.com/cnjy/p/3820808.html
Copyright © 2020-2023  润新知