C++;小型与全大写数据类型 为什么在C++(MSV)中,定义了所有CAP的数据类型(并且大部分都是相同的)?< /P>
这些完全一样。为什么定义了所有caps版本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
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" );