我在Cygwin上使用g ++(GCC)4.9.3。我无法将getchar_unlocked
或putchar_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');
^
答案 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
启用扩展功能。