为什么在使用g ++而不是gcc进行编译时,在stdio.h中定义了_LARGEFILE_SOURCE?

Mic*_*bbé 0 c c++ gcc large-file-support large-files

如果使用gcc lfs.c -o lfs编译以下代码,则不会输出任何内容.但是,如果使用g ++ lfs.c -o lfs编译它,则会打印"由stdio.h!"定义的"_LARGEFILE_SOURCE".

#ifdef _LARGEFILE_SOURCE
int largefile_defined_at_start = 1;
#else
int largefile_defined_at_start = 0;
#endif

// This defines _LARGEFILE_SOURCE, but only in C++!
#include <stdio.h>

int main(void) {
#ifdef _LARGEFILE_SOURCE
  if (!largefile_defined_at_start)
    printf("_LARGEFILE_SOURCE defined by stdio.h!");
#endif
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下,编译器都没有定义_LARGEFILE_SOURCE:

gcc -dM -E - < /dev/null |grep _LARGEFILE_SOURCE |wc -l
0
g++ -dM -E - < /dev/null |grep _LARGEFILE_SOURCE |wc -l
0
Run Code Online (Sandbox Code Playgroud)

为什么stdio.h在通过g ++前端调用GCC时定义_LARGEFILE_SOURCE?

Die*_*Epp 6

因为g ++定义了_GNU_SOURCE,它基本上暗示了所有其他特征宏,例如_LARGEFILE_SOURCE.<features.h>包含标头时定义了这些附加宏,并且大多数系统头文件包含<features.h>在文件的最早期._GNU_SOURCE对于想要编写可移植C++代码的人来说,预定义的事实是一个令人沮丧的持续来源.

我相信你可以简单地说:

#undef _GNU_SOURCE
Run Code Online (Sandbox Code Playgroud)

但是,这会破坏libstdc ++.哎哟! 太痛苦了!这一切都源于C++中最大的设计缺陷之一,这#include是基本上是文本包含的事实.由于大多数libstdc ++都是在头文件中定义的(不仅仅是声明!),这意味着它们会污染你的程序_GNU_SOURCE.

如果您需要访问隐藏的界面_GNU_SOURCE(strerror_r例如,完全被破坏_GNU_SOURCE),那么您只能从不使用任何libstdc ++标头的文件访问这些界面.

据我所知,这只是libstdc ++的一个问题,所以我认为你也可以通过使用libc ++或类似的东西来避免这个问题.

  • @FUZxxl:我可能会使用"病态"这个词,但"怪异"的作品. (2认同)