putchar_unlocked在 C++ 14 标准中不起作用
putchar_unlocked doesn't work in C++ 14 standard
我在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');
^
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
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- C++ 模板类型检查标准::is_same不起作用?
- 快速扫描标准以获取整数不起作用
- 使用 xcvdata 删除标准 TCP IP 端口不起作用
- 标准::矢量数组不起作用
- ios_base::sync_with_stdio(false) 在来自标准输入的两个输入之间不起作用
- 包含标准标头后,Vim 代码补全不起作用
- C++迭代时删除列表成员:标准解决方案不起作用
- 标准::列表::擦除不起作用
- C++ 标准::查找自定义比较器不起作用
- 为什么颜色对标准标准不起作用?(PDCurses)
- putchar_unlocked在 C++ 14 标准中不起作用
- 标准:: 对我不起作用
- 如何从标准字符串 (c_str()) 中设置字符 * 值不起作用
- 标准函数和操作在类构造函数中不起作用
- 模板化函数中的静态标准::互斥锁不起作用