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

putchar_unlocked doesn't work in C++ 14 standard

本文关键字:标准 不起作用 C++ unlocked putchar      更新时间:2023-10-16

我在Cygwin上使用g++(GCC)4.9.3。我无法将getchar_unlockedputchar_unlocked与C++14标准一起使用
考虑这个样本代码

#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或C++标准的一部分,Cygwin也没有实现任何其他提供putchar_unlocked的标准。

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

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

putchar_unlocked不是任何C++标准的一部分。它是POSIX标准的一部分,但定义-std=c++14会导致gcc定义__STRICT_ANSI__Cygwin使用Newlib作为C标准库,从它的来源我们可以看到,这阻止了putchar_unlocked的声明,而且无论如何都没有任何其他宏来启用它。

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

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

该问题下的一条评论指出,该代码适用于Ideone。这可能是因为Ideone运行在不同的平台(如Linux)上,可能有glibc,它为putchar_unlocked提供了不同的条件(来自本手册页):

glibc的特性测试宏要求(请参阅feature_test_macros(7)):

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