Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;小型与全大写数据类型 为什么在C++(MSV)中,定义了所有CAP的数据类型(并且大部分都是相同的)?< /P>_C++_C_Visual Studio_Typedef - Fatal编程技术网

C++;小型与全大写数据类型 为什么在C++(MSV)中,定义了所有CAP的数据类型(并且大部分都是相同的)?< /P>

C++;小型与全大写数据类型 为什么在C++(MSV)中,定义了所有CAP的数据类型(并且大部分都是相同的)?< /P>,c++,c,visual-studio,typedef,C++,C,Visual Studio,Typedef,这些完全一样。为什么定义了所有caps版本 double和typedef double-double char和typedef char bool和bool(typedef int bool),这里所有的小大写和全大写都代表布尔状态,为什么在后者中使用int 通过这些额外的数据类型获得了什么额外的功能?Microsoft决定在Windows代码中为所有这些类型创建宏或类型别名。有可能是为了和所有caps WinAPI类型别名保持“一致性”,比如LPCSTR 但它有什么真正的好处呢?没有 BOOL

这些完全一样。为什么定义了所有caps版本

double
typedef double-double

char
typedef char

  • bool
    bool
    typedef int bool
    ),这里所有的小大写和全大写都代表布尔状态,为什么在后者中使用
    int


  • 通过这些额外的数据类型获得了什么额外的功能?

    Microsoft决定在Windows代码中为所有这些类型创建宏或类型别名。有可能是为了和所有caps WinAPI类型别名保持“一致性”,比如
    LPCSTR

    但它有什么真正的好处呢?没有


    BOOL
    的情况尤其令人头痛。虽然一些老学校C有这样的约定(在实际的<代码> Boo[/COD]进入语言之前),但现在它确实令人困惑……尤其是在使用WinAPI和C++时,

    < P> ALLCAPS类型DEFS在Windows编程的第一天开始(1和以前)。例如,当时没有
    bool
    类型。Windows API和报头被定义为旧的学校。C++在开发时甚至不存在。

    因此,为了更好地记录API,引入了编译器宏,如
    BOOL
    。尽管
    BOOL
    INT
    都是相同基础类型(
    INT
    )的宏,但这可以让您查看函数的类型签名,以查看参数或返回值是作为布尔值(定义为“0表示false,任何非零值表示true”)还是任意整数

    作为另一个例子,考虑<代码> LPCSTR < /代码>。在16位窗口中,有两种指针:

    near
    指针是16位指针,
    far
    指针同时使用16位“段”值和16位偏移量。实际内存地址在硬件中计算为
    (段只有MS知道)

    我所能想到的唯一好处是某些类型(例如,
    int
    )的大小取决于操作系统(请参阅)。这将允许在64位操作系统上使用16位类型,以及更多的
    typedefs
    #defines
    。这些代码将更容易移植到其他操作系统版本


    现在,如果这个“可移植”的东西是真的,那么其余的类型将遵循相同的约定,即使它们的大小在所有机器上都是相同的。

    这个约定可以追溯到30多年前Windows操作系统的早期

    在70年代和80年代早期,目前的做法仍然是在各种汇编语言和当时的高级语言、Fortran、Cobol……以及命令行解释器和文件系统默认值的编程中使用所有CAP。这一习惯可能源于穿孔卡的编码,可以追溯到20世纪初里

    当我在1975年开始编程时,我们使用的卡片穿孔机甚至不支持小写字母

    MS/DOS是用汇编语言编写的,就像80年代早期最成功的PC软件包一样,如Lotus 1-2-3、MS Word等。C是贝尔实验室为Unix系统发明的,花了很长时间才在PC世界获得发展势头

    在刚刚萌芽的微处理器世界中,实际上有两个不同的流派:一个是包含所有caps汇编文档的Intel little endian world,另一个是包含小型caps汇编、C和Unix操作系统以及克隆和其他怪异语言(如lisp)的big endian Motorola alternative

    Windows是前者的产物,所有大写类型和修饰符的激增在当时看起来并不丑陋,它看起来是一致的和令人放心的。微软尝试了各种指针修饰符的替代品:
    far
    \u far
    \u far
    far
    ,最后彻底摆脱了它们,但保留了原有的功能原始的allcaps TypeDef出于兼容性目的,导致了愚蠢的妥协,例如32位
    甚至在64位系统上


    这个答案并不是没有偏见的,但恢复这些记忆是很有趣的。

    额外的头痛而不是额外的能力。你确定吗?参考?我怀疑这也是关于他们的内部代码样式…@EugeneSh:我确定这很傻,我希望他们没有这么做。至于实际的参考,你可能不得不等待对于一个员工来说。@EugeneSh:我不能完全同意,但这里也有客观性:OP询问添加了什么能力,就我所知,答案实际上是“无”。我想知道这是否是对未来校对的误导性尝试,但无法真正找到一种方法使其符合逻辑。@EugeneSh。您可以参考我。:-)在1.0时代,我一直在积极编程Windows。LRiO的回答是正确的,我在自己的回答中发表了一些其他想法。关于这段奇怪的历史,请随时提问。我记得那些日子:阿尔法版本的绿色活页夹,有三个5英寸和1/4英寸的活页夹,鼠标有绿色按钮和一个闪亮的钢球。。。我怀疑最终的起源是C宏是大写的约定的结合,特别是对于常量,如TRUE和FALSE,以及所有caps汇编语言实践的长期习惯,在这些实践中,大小写基本上被忽略了。但是代码实际上是针对特定的操作系统的。这种事情使移植变得更困难,而不是更容易。@LightnessRacesinOrbit它的设计目的是更容易移植到同一操作系统中的不同CPU架构。@immibis:这更有意义,有点像。因此,在不同的体系结构上,
    INT
    的定义将从
    INT
    更改为固定宽度类型之一?成功
    SetWindowText( hwnd, TEXT("Howdy") );
    
    SetWindowTextA( hwnd, "Howdy" );
    
    SetWindowTextW( hwnd, L"Howdy" );