putchar_unlocked 在 C++ 14 标准中不起作用

putchar_unlocked doesn't work in C++ 14 standard

我在 Cygwin 上使用 g++ (GCC) 4.9.3。我无法在 C++ 14 标准中使用 getchar_unlockedputchar_unlocked
考虑这个示例代码

#include <cstdio>

int main() {
    putchar_unlocked('1');
    return 0;
}

当我用

编译并运行
g++ foo.cpp && a.exe && rm ./a.exe

我得到预期的输出 1。
但是当我这样做时

g++ -std=c++14 foo.cpp && a.exe && rm ./a.exe

我收到错误提示 putchar_unlocked 未声明。

foo.cpp: In function 'int main()':
foo.cpp:4:22: error: 'putchar_unlocked' was not declared in this scope
  putchar_unlocked('1');
                      ^

putchar_unlocked 不是任何 C++ 标准的一部分。它是 POSIX 标准的一部分,但定义 -std=c++14 会导致 gcc 定义 __STRICT_ANSI__ 宏。 Cygwin uses Newlib for C standard library, and from its sources 我们可以看到这会阻止 putchar_unlocked 被声明,而且无论如何也没有任何其他宏可以启用它。

因此,我们需要去掉__STRICT_ANSI__。使用 -std=gnu++14 应该这样做:

g++ -std=gnu++14 foo.cpp && a.exe && rm ./a.exe

问题下的评论指出代码适用于 Ideone. This is probably, because Ideone runs on different platform (such as Linux), which probably has glibc, which provides putchar_unlocked with different conditions (from this manual page):

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

getc_unlocked(), getchar_unlocked(), putc_unlocked(), putchar_unlocked(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE || _BSD_SOURCE || _SVID_SOURCE

putchar_unlocked 不是任何版本的 C 或 C++ 标准的一部分,Cygwin 也没有实现任何其他提供 putchar_unlocked.

的标准

Cygwin 确实提供 putchar_unlocked 作为非标准扩展,但您实际上需要启用非标准扩展。

默认的 -std= 版本是 -std=gnu++03(或其同义词之一)。这是 C++03 加上扩展。您将其更改为 -std=c++14。这是 C++14 没有 扩展。使用 -std=gnu++14 启用扩展程序。