与 C 代码相比,为什么 C++ 代码不需要“#define _POSIX_C_SOURCE 200809L”?
in contrast to C code, why C++ code doesn't need "#define _POSIX_C_SOURCE 200809L"?
当我使用 "POSIX interval timer" 或进行信号处理时,
我必须插入
#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")
让我们做一个简单的实验。尝试编译这个简短的源文件:
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++标准库头文件的某处,定义了这个宏。
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
处的宏说明
当我使用 "POSIX interval timer" 或进行信号处理时, 我必须插入
#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")
让我们做一个简单的实验。尝试编译这个简短的源文件:
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++标准库头文件的某处,定义了这个宏。
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
处的宏说明