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

时间:2015-11-11 20:06:35

标签: c++ cygwin posix

我在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');
                      ^

2 个答案:

答案 0 :(得分:2)

putchar_unlocked不是任何C ++标准的一部分。它是POSIX标准的一部分,但定义-std=c++14会导致 gcc 定义__STRICT_ANSI__宏。 Cygwin uses Newlib用于C标准库,from its sources我们可以看到这可以防止putchar_unlocked被声明,而且还有#&} 39;无论如何都要启用它。

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

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

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

  

glibc的功能测试宏要求(参见   feature_test_macros(7)):

     

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

答案 1 :(得分:2)

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

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

默认-std=版本为-std=gnu++03(或其中一个同义词)。这是C ++ 03 plus扩展。您将其更改为-std=c++14。这是没有扩展的C ++ 14 。使用-std=gnu++14启用扩展功能。