许多文本警告说,将ASCII值作为整数处理是不可移植的,例如,假设'A‘的值是65 (如在char中)。
但是,是什么决定了这个字符集是ASCII (或扩展形式)还是其他字符集呢?它是由操作系统还是由编译器决定的?我假设这不依赖于硬件。
例如,Intel PC是否可以使用EBCDIC这样的字符集(理论上)?在Linux/Unix中更改LANG环境变量是否会更改C程序的基本字符集的值(如果重新编译)?
(编辑:我现在看到Linux中的各种非拉丁字符集都有相同的基本ASCII码,例如KOI8-U -I假设有一些变体的字符集与ASCII码不兼容)
发布于 2013-03-06 23:37:37
该标准并不关心这些细节,就它而言,只有“实现”。
在实践中,硬件和OSes都可以指定平台上的C实现期望使用的实现细节,或者如果它们想要与系统函数(也就是操作系统或硬件提供的代码)进行互操作时需要使用的实现细节。所以我们经常说,"on Win32,sizeof(void*) == 4“。不过,这是一种速记,因为如果有人愿意,可以编写一个运行在32位Windows上的C实现,并且具有不同的指针大小。我们真正的意思是,“在运行在Win32上的Win32 ABI、sizeof(void*) == 4和C实现中,不遵循Win32 ABI被排除在考虑范围之外”。
因此,实现可以做任何他们喜欢的事情,只要他们不介意他们是否可以(例如)使用遵循系统约定的dll。字符集可以根据编译器和标准库的作者的喜好进行定义,只受标准中的内容约束。
也就是说,字符字面值是编译时常量。这告诉您基本执行字符集在运行时不能更改。
此外,如果它依赖于环境变量,那么某人就有责任确保程序以与编译时相同的值运行。这将是非常不友好的用户,但标准实际上并没有禁止某人编写一个对程序如何运行有特殊限制的C实现。
发布于 2013-03-06 23:35:34
C标准是这样说的:
C99中的§5.2.1/1
应定义两组字符集及其相关的排序序列:写入源文件的字符集(源字符集)和在执行环境中解释的字符集(执行字符集)。每个字符集又进一步分为一个基本字符集(其内容由该子句给出)和一组零个或多个特定于区域设置的成员(不是基本字符集的成员),称为扩展字符。组合字符集也称为扩展字符集。执行字符集成员的值是实现定义的。
在启动时,编译器必须使用C语言环境,当调用setlocale(LC_ALL, "");时,它将只获取操作系统的语言环境。
发布于 2013-03-06 23:28:18
编译器清楚地确定使用哪个源和执行字符集,因为可以发生交叉编译(例如,在使用ASCII的Linux机器上为使用EBCDIC的IBM大型机编译代码)。
https://stackoverflow.com/questions/15251049
复制相似问题