C++代码和C版本宏

10

我预计这是一个过于具体的问题。这可能是因为我缺乏一些基础知识,而通过谷歌搜索无法找到答案。如果回答更一般版本的问题更有意义,请随意回答。

给定一些C++代码,我想知道它的特定标准版本以及其对应的C标准版本(如果有的话)是否相关,并且如何相关。

我已经验证了这个测试代码

#include <cstdio>
int main(void)
{
    printf("%ld\n", _POSIX_C_SOURCE);
    return 0;
}

使用任何一个"g++ -std=c++98"、"g++ -std=c++11"、"clang++ -std=c++98"或"clang++ -std=c++11"编译时,将打印出"200809"。

使用任何明确的标准版本编译C代码时,_POSIX_C_SOURCE宏根本没有被定义。

为什么会这样呢?最不合理的是,使用C++98编译的结果使得_POSIX_C_SOURCE成为了200809(也就是说晚了10年)。


可能是由于某些编译器扩展! - haccks
1
_GNU_SOURCE_BSD_SOURCE_POSIX_C_SOURCE等宏是由正在编译的程序设置而不是编译器环境设置的。从C++包含文件中设置它们有点像一个错误,尽管标准库的作者可能发现这对于某些inline函数的工作是必要的。 - Simon Richter
@SimonRichter:说得好。我最初提出这个问题是想设置 _POSIX_C_SOURCE 以获取 getchar_unlocked()。那么可接受的方法是先包含 C++ 标头,然后重新定义 _POSIX_C_SOURCE,再包含 C 标头吗? - Jo So
@JoSo:你目前在哪个编译环境下编译C代码,以至于能够得到no _POSIX_C_SOURCE?在正常情况下,要使用getchar_unlocked(),你需要使用足够新的glibc并且包含#include <stdio.h> - Bill Lynch
@JoSo,特性声明宏必须始终位于第一个包含文件之前。C++头文件需要能够处理预定义的宏。 - Simon Richter
显示剩余3条评论
3个回答

14

您可能正在寻找以下两种内容:

  • 如果您想检测C++98:宏__cplusplus的定义为199711L
  • 如果您想检测C++11:宏__cplusplus的定义为201103L

如果您想检测编译器版本,则此网站提供了关于各种适用宏的大量信息:http://sourceforge.net/p/predef/wiki/Compilers/

至于_POSIX_C_SOURCE,这是C标准库中可用特性的一个属性。因此,因为您正在使用新的glibc(至少2.10),您可以支持这些特性。

至于C编译器未报告这些值,您可能需要显式包含<features.h>以访问它们。


这是否意味着_POSIX_C_SOURCE宏和我通过“-std = XXX”设置的内容(无论是C还是C ++)是完全独立的事物? - Jo So

7

我认为这是因为_POSIX_C_SOURCE与任何C++标准规范无关,而与POSIX规范有关:

_POSIX_C_SOURCE
          Defining this macro causes header files to expose definitions
          as follows:

          ·  The value 1 exposes definitions conforming to POSIX.1-1990
             and ISO C (1990).

          ·  The value 2 or greater additionally exposes definitions for
             POSIX.2-1992.

          ·  The value 199309L or greater additionally exposes
             definitions for POSIX.1b (real-time extensions).

          ·  The value 199506L or greater additionally exposes
             definitions for POSIX.1c (threads).

          ·  (Since glibc 2.3.3) The value 200112L or greater exposes
             definitions corresponding to the POSIX.1-2001 base
             specification (excluding the XSI extension).

          ·  (Since glibc 2.10) The value 200809L or greater exposes
             definitions corresponding to the POSIX.1-2008 base
             specification (excluding the XSI extension).

您获得的值是编译器/库支持的默认值。

0

_POSIX_C_SOURCE可能是编译器扩展。

它是一个 POSIX 规范,而不是 C++ 规范。

因此一些编译器可能不支持它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接