如果使用gcc lfs.c -o lfs编译以下代码,则不会输出任何内容。但是,如果使用g ++ lfs.c -o lfs编译它,则会打印“由stdio.h定义的_LARGEFILE_SOURCE!”。
$('div').click(FunctionToCall());
在任何一种情况下,编译器都没有定义_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;
}
为什么stdio.h在通过g ++前端调用GCC时定义_LARGEFILE_SOURCE?
答案 0 :(得分:6)
因为g ++定义了_GNU_SOURCE
,它基本上暗示了所有其他特征宏,例如_LARGEFILE_SOURCE
。当包含<features.h>
标头时,将定义这些附加宏,并且大多数系统头文件在文件的早期包含<features.h>
。预定义_GNU_SOURCE
这一事实对于想要编写可移植C ++代码的人来说是一个持续不断的挫折源。
我相信你可以简单地说:
#undef _GNU_SOURCE
但是,这会破坏libstdc ++。哎哟!太痛苦了!这一切都源于C ++中最大的设计缺陷之一,即#include
基本上是文本包含。由于大多数libstdc ++是在头文件中定义的(不仅仅是声明!),这意味着它们会使用_GNU_SOURCE
污染您的程序。
如果您需要访问_GNU_SOURCE
隐藏的界面(例如strerror_r
,完全被_GNU_SOURCE
打破),那么您只能从文件中访问这些界面不要使用任何libstdc ++标头。
据我所知,这只是libstdc ++的一个问题,所以我认为你也可以通过使用libc ++或类似的东西来避免这个问题。