在涉及setlocale的部分中,ANSI C标准在脚注中指出,其行为不受当前语言环境影响的唯一ctype.h函数是isdigit和isxdigit.
isdigit的Microsoft实现依赖于语言环境,因为,例如,在使用代码页1250的语言环境中,isdigit仅对0x30('0') - 0x39('9')范围内的字符返回非零值,而在使用代码页的语言环境中对于上标数字0xB2('²'),0xB3('³')和0xB9('¹'),1252 isdigit也返回非零值.
Microsoft是否依赖于isdigit语言环境违反了C标准?
在这个问题中,我主要对C90感兴趣,C90是微软声称要遵守的,而不是C99.
附加背景:
Microsoft自己的setlocale文档错误地指出isdigit不受语言环境的LC_CTYPE部分的影响.
涵盖ctype.h函数的C标准部分包含一些我认为含糊不清的措辞:
这些函数的行为受当前语言环境的影响.下面将说明仅在不在"C"语言环境中时具有语言环境特定方面的那些函数.
我认为这是模棱两可的,因为不清楚它是什么试图说的isdigit这样的函数,没有关于locale特定方面的注释.它可能试图说这些函数必须假定依赖于语言环境,在这种情况下,Microsoft的isdigit实现就可以了.(除了我之前提到的脚注似乎与这种解释相矛盾.)
以下C程序:
#include <stdio.h>
int main(void)
{
printf("%u %u %u\n",sizeof "",sizeof(""+0),sizeof(char *));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Linux上使用GCC编译时输出1 4 4,但在Windows上使用Microsoft Visual C++编译时输出1 1 4.海湾合作委员会的结果是我所期待的.它们是否有区别,因为MSVC有错误或者因为sizeof(""+ 0)未定义?对于两个编译器,无论使用什么字符串文字或整数常量,行为(即打印的中间值是否等于第一个值或最后一个值)都是相同的.
ANSI C标准中的相关参考似乎是6.2.2.1 - 左值和函数指示符:
"除非它是sizeof运算符的操作数...具有类型'数组类型'的左值被转换为具有类型'指向类型的指针'的表达式,该表达式指向数组对象的初始元素,而不是一个左值".
这里虽然"Except"不适用,因为在sizeof(""+ 0)中,数组/字符串文字是+而不是sizeof的操作数.