【问题标题】:Inconsistent return from std::isblank between Visual C++ and gcc. Which one is wrong?Visual C++ 和 gcc 之间的 std::isblank 返回不一致。哪一个是错的?
【发布时间】: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


【解决方案1】:

是的,MSVS 是错误的。 [locale.statics] 声明:

static const locale& classic();
  1. “C”语言环境。

  2. 返回:实现经典“C”语言环境语义的语言环境,等效于值 locale(“C”)。

  3. 备注:此语言环境、它的方面及其成员函数不会随时间而改变。

因此如下:

std::isblank('\n', std::locale::classic()); 

等同于:

std::isblank('\n');  
 

在哪里调用了locale("C")

【讨论】:

    猜你喜欢
    • 2014-04-11
    • 2011-07-05
    • 1970-01-01
    • 2017-12-19
    • 2016-12-10
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多