与C代码相比,为什么C++代码不需要"#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++标准库头文件的某个地方,定义了这个宏。

最新更新