putchar_unlocked 在 C++ 14 标准中不起作用
putchar_unlocked doesn't work in C++ 14 standard
我在 Cygwin 上使用 g++ (GCC) 4.9.3。我无法在 C++ 14 标准中使用 getchar_unlocked
或 putchar_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
启用扩展程序。
我在 Cygwin 上使用 g++ (GCC) 4.9.3。我无法在 C++ 14 标准中使用 getchar_unlocked
或 putchar_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
启用扩展程序。