【发布时间】:2016-06-14 22:58:21
【问题描述】:
如果下面的代码是用 gcc lfs.c -o lfs 编译的,它什么也不打印。但是,如果使用 g++ lfs.c -o lfs 编译,则会打印“_LARGEFILE_SOURCE defined by stdio.h!”。
#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;
}
在任何一种情况下,_LARGEFILE_SOURCE 都不是由编译器定义的:
gcc -dM -E - < /dev/null |grep _LARGEFILE_SOURCE |wc -l
0
g++ -dM -E - < /dev/null |grep _LARGEFILE_SOURCE |wc -l
0
当通过 g++ 前端调用 GCC 时,为什么 stdio.h 会定义 _LARGEFILE_SOURCE?
【问题讨论】:
-
你在什么平台上编程?你是在针对 glibc 编程吗?
-
_LARGEFILE_SOURCE反正已经过时了,你为什么认为你需要它?遗留代码? -
@BaummitAugen 它没有过时。如果你在 i386 Linux 上编译一个 C 程序,你会得到一个 32 位的
off_t默认情况下。_LARGEFILE_SOURCE有点需要。 -
@FUZxxl 如果您只使用
#define _FILE_OFFSET_BITS 64代替,它已经过时了。 -
@FUZxxl
_FILE_OFFSET_BITS 64是标准的 POSIX afaik,就像_LARGEFILE_SOURCE。虽然后者被称为历史和“新程序不应该使用这个宏;定义 _XOPEN_SOURCE 就像刚刚描述的那样或定义 _FILE_OFFSET_BITS 的值为 64 是实现相同结果的首选机制。” man7.org/linux/man-pages/man7/feature_test_macros.7.html
标签: c++ c gcc large-files large-file-support