【发布时间】:2023-03-04 13:37:01
【问题描述】:
我在 Windows 上的 Visual C++ 和 Ubuntu 上的 gcc 之间对 std::isblank 的调用中看到不一致的行为,我想知道哪个是正确的。
在两个编译器上——当默认语言环境是“C”语言环境时——以下调用返回 false
std::isblank('\n');
这是我所期望的。它与我在cppreference.com 上看到的一致
在默认的 C 语言环境中,只有空格 (0x20) 和水平制表符 (0x09) 被归类为空白字符。
但是对于 C++,我们也有带有 std::locale 参数的版本
std::isblank('\n', std::locale::classic());
我在这里提供std::locale::classic。这不应该等同于以前的电话吗?因为当我在 Windows 上调用第二个版本时,它返回 true。它认为换行符是空白字符。 Linux 仍然说是假的。
我的理解(关于std::locale::classic)是否正确?如果是这样,是不是 Visual C++ 版本错了?
【问题讨论】:
-
取决于您想要获得的经典程度。它使其与操作系统的假设一致。基础调用是 GetStringTypeA(),检索字符的 C1_TYPE。 \n 是 AT&T,\r\n 是 DEC,\n 在电传打字机上相当空白 :) 非常典型的 Windows 方法,它强烈避免使用多个 oracle。
-
我希望经典成为标准所说的那样,以及他们自己的 CRT 版本的功能和文档所说的那样。无论如何,我提交了它,他们承认这是一个已知问题,所以我想就是这样。
-
我知道,我知道,没有人关心它为什么错了。
标签: c++ visual-studio gcc locale