底层字符集是否仅取决于 C 实现?

2023-11-26

许多文本警告说,处理char整数值不可移植,例如假设“A”的值为 65(如 ASCII 所示)。

但是什么决定了该字符集是 ASCII(或扩展形式)还是其他字符集呢?是由操作系统决定的,还是由编译器决定的?我认为这不依赖于硬件。

例如,Intel PC 是否可以具有 EBCDIC 等字符集(理论上)?并且可以改变LANGLinux/Unix中的环境变量改变了C程序的基本字符集的值(如果然后重新编译)?

(编辑:我现在看到 Linux 中的各种非拉丁字符集都具有相同的基本 ASCII 代码,例如KOI8-U- 我假设有一些变体的字符集与 ASCII 不兼容)


该标准不关心任何这些细节,就它而言,只有“实现”。

实际上,硬件和操作系统都可以指定该平台上的 C 实现预期使用的实现细节,或者它们是required如果他们想要与系统功能(即操作系统或硬件提供的代码)进行互操作,则可以使用。所以我们经常说“在 Win32 上,sizeof(void*) == 4“。不过,这是一个简写,因为有人could,如果他们选择,请编写一个在 32 位 Windows 上运行并具有不同指针大小的 C 实现。我们真正的意思是,“在 Win32 ABI 中,sizeof(void*) == 4,并且在 Win32 上运行且不遵循 Win32 ABI 的 C 实现不予考虑”。

因此,实现可以为所欲为,只要它们不介意是否可以(例如)使用遵循系统约定的 dll。字符集可以根据编译器和标准库的编写者的喜好进行定义,仅受标准中的内容影响。

也就是说,字符文字的值是编译时常量。这告诉您基本执行字符集在运行时不能更改。

此外,如果它依赖于环境变量,那么有人有责任确保程序以与编译时相同的值运行。这对用户来说非常不友好,但标准实际上并没有forbid有人编写了对程序运行方式有特殊限制的 C 实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

底层字符集是否仅取决于 C 实现? 的相关文章

随机推荐