与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
in contrast to C code, why C++ code doesn't need "#define _POSIX_C_SOURCE 200809L"?
当我使用"POSIX间隔计时器"或进行信号处理时,我必须插入
#define _POSIX_C_SOURCE 200809L
在我的任何文件的第1行。但我发现只有C代码需要它,而C++代码不需要它。
g++
编译器与gcc
编译器的工作方式有何不同在这个问题上?
下面是我的系统环境(gcc:相同版本(
user@~ $ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
我在CMakeLists.txt 中添加了这一行
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++14 -Wall")
g++定义了_GNU_SOURCE,它定义了_POSIX_C_SOURCE。
这样做是因为标准c++模板库需要它。
在https://gcc.gnu.org/bugzilla/show_bug.cgi?id=2082
宏的描述https://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html
让我们做一个简单的实验。尝试编译这个短源文件:
auto f()
{
return _POSIX_C_SOURCE;
}
没有。由于未定义_POSIX_C_SOURCE
,因此它不会编译。
但是如果我们包含一个C++头呢?
#include <iostream>
auto f()
{
return _POSIX_C_SOURCE;
}
它编译得很好。
(现场试用:https://godbolt.org/z/C6_a6P)
这意味着它与g++无关。在一些C++标准库头文件的某个地方,定义了这个宏。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 将使用双向popen()的C++代码移植到POSIX的最佳方式