C++ 数据类型移植到c++;从win32到Linux的代码

C++ 数据类型移植到c++;从win32到Linux的代码,c++,linux,winapi,C++,Linux,Winapi,我有一个使用win32编写的c++代码。就其使用的数据类型而言: 原语(int、double、float、bool、long,…) Windows数据类型(INT、SHORT、LONG、BOOL、BYTE、WCHAR,…) 还有一些其他数据类型:\uuu int64和wchar\u t 问题: 一,。要将此代码移植到Linux,我应该使用什么数据类型 二,。或者,要使其跨平台(Linux和win32),这些数据类型是否与(i)中的不同 提前谢谢 当然,您应该使用该语言提供的数据类型。这些是基本的

我有一个使用win32编写的c++代码。就其使用的数据类型而言:

  • 原语(
    int、double、float、bool、long
    ,…)

  • Windows数据类型(
    INT、SHORT、LONG、BOOL、BYTE、WCHAR
    ,…)

  • 还有一些其他数据类型:
    \uuu int64
    wchar\u t

  • 问题:

    一,。要将此代码移植到Linux,我应该使用什么数据类型

    二,。或者,要使其跨平台(Linux和win32),这些数据类型是否与(i)中的不同


    提前谢谢

    当然,您应该使用该语言提供的数据类型。这些是基本的数据类型,如
    char
    int
    。除此之外,使用
    int8\u t
    int16\u t
    。。。依此类推,在
    标题中定义

    当谈到
    BOOL
    时要小心,不过,如果我没记错的话,有些窗口将
    BOOL
    定义为
    char
    ,而其他部分则使用
    int
    。我认为甚至在某些地方,除了
    TRUE
    FALSE
    (分别是
    1
    0
    )之外的值都与数据类型
    BOOL
    一起使用

    因此,天真地将每个
    BOOL
    更改为
    BOOL
    ,将每个
    WCHAR
    更改为
    WCHAR\u t
    可能会在重载解析方面带来意外,如果这些类型用于序列化,甚至会极大地破坏代码

    我想到的另一件事是Window处理ASCII/Unicode的方法,它使用所有这些
    TCHAR
    s,根据预处理器的定义,它们可能最终成为
    CHAR
    WCHAR
    ,所以您需要决定如何传输它们


    一些一般性建议:

    不要误用类型。例如,不要将变量、参数和返回类型定义为
    int
    ,如果它们存储诸如句柄或指针之类的内容(例如
    HINSTANCE
    HWND
    ,等等)。而是为此定义一个有意义的类型,例如

    using native_handle_t = HINSTANCE;
    
    这样就可以很容易地为linux或其他平台提供一个替代定义,而无需搜索和更改整个代码库


    说到序列化,例如写入二进制文件,您应该坚持使用固定大小的类型(
    uint8\u t
    uint16\u t
    ,…),因为它们在每个平台上的大小都是正确的。在
    long
    大小为
    4
    的平台上发送
    long
    的网络数据包,并在
    long
    大小为
    8
    的平台上读取这些数据包,这不一定是件好事

    当然,您应该使用该语言提供的数据类型。这些是基本的数据类型,如
    char
    int
    。除此之外,使用
    int8\u t
    int16\u t
    。。。依此类推,在
    标题中定义

    当谈到
    BOOL
    时要小心,不过,如果我没记错的话,有些窗口将
    BOOL
    定义为
    char
    ,而其他部分则使用
    int
    。我认为甚至在某些地方,除了
    TRUE
    FALSE
    (分别是
    1
    0
    )之外的值都与数据类型
    BOOL
    一起使用

    因此,天真地将每个
    BOOL
    更改为
    BOOL
    ,将每个
    WCHAR
    更改为
    WCHAR\u t
    可能会在重载解析方面带来意外,如果这些类型用于序列化,甚至会极大地破坏代码

    我想到的另一件事是Window处理ASCII/Unicode的方法,它使用所有这些
    TCHAR
    s,根据预处理器的定义,它们可能最终成为
    CHAR
    WCHAR
    ,所以您需要决定如何传输它们


    一些一般性建议:

    不要误用类型。例如,不要将变量、参数和返回类型定义为
    int
    ,如果它们存储诸如句柄或指针之类的内容(例如
    HINSTANCE
    HWND
    ,等等)。而是为此定义一个有意义的类型,例如

    using native_handle_t = HINSTANCE;
    
    这样就可以很容易地为linux或其他平台提供一个替代定义,而无需搜索和更改整个代码库

    说到序列化,例如写入二进制文件,您应该坚持使用固定大小的类型(
    uint8\u t
    uint16\u t
    ,…),因为它们在每个平台上的大小都是正确的。在
    long
    大小为
    4
    的平台上发送
    long
    的网络数据包,并在
    long
    大小为
    8
    的平台上读取这些数据包,这不一定是件好事

    详细说明s关于
    BOOL
    的回答

    Windows有:

    • BOOL
      是一种32位类型。
      TRUE
      FALSE
      定义指定了基本值,但大多数返回
      BOOL
      的API都记录为在成功时返回非零,因此您只需编写
      BOOL succ=somefunc();如果(成功){…}

    • BOOLEAN
      是一种8位类型。主要由windownt内核和NT-API使用,但多年来已在多个地方泄漏到Win32中

    • VARIANT\u BOOL
      是COM/Automation中使用的16位类型
      VARIANT_FALSE
      为0,而
      VARIANT_TRUE
      实际上为-1(
      0xffff

    由于
    VARIANT\u BOOL
    是如何定义的,以及
    BOOL
    是如何使用的,因此您应该只测试某个内容是否为假(与0相比),或者使用
    if(x)
    和/或
    if(!x)
    样式表达式…

    详细说明了作者关于
    BOOL
    的答案

    Windows有:

    • BOOL