奇思妙想 · 2024年 3月 31日 0

gcc 1.c和g++ 1.c预处理有什么区别?

62 次浏览

借用 gcc 1.c和g++ 1.c有什么区别? 的示例代码,预处理差异在stdio.h预处理后的结果。

  • __BEGIN_DECLS在C/C++编译器结果不同,g++会展开成extern “C” {
  • g++默认定义了_GNU_SOURCE宏,会开启__USE_GNU, 会包含cookie_io头文件, 也增加了一些特有的函数,例如:
    #include <bits/types/cookie_io_functions_t.h>
    extern int renameat2 (int __oldfd, const char *__old, int __newfd, const char *__new, unsigned int __flags) noexcept (true);
  • 如上,_GNU_SOURCE开启了__USE_LARGEFILE64, 定义如下64位类型以及相关函数声明:
    typedef __fpos64_t fpos64_t;
  • __THROW在gcc和g++定义不同, 影响蛮多函数声明:
    gcc: __attribute__ ((__nothrow__ , __leaf__))
    g++: noexcept (true)
  • g++有开启__GLIBC_USE (LIB_EXT2),启用了*asprintf函数。
  • g++开启__HAVE_FLOAT128, 定义Complex和_Float*相关的类型。

总结一下,g++默认定义__cplusplus和_GNU_SOURCE(间接定义了__USE_GNU, __USE_LARGEFILE64等宏),在预处理头文件上有一些差异,总体而言,并不会改变如上示例代码预处理的总体结构和运行结果。

_GNU_SOURCE是何方神圣? 如何知道g++编译默认会定义_GNU_SOURCE?