statfs構造体

error: redefinition of `struct statfs'というエラーが出た。
statfsを定義しているファイルは以下の2つ。

% grep -r '^struct statfs' /usr/include
/usr/include/bits/statfs.h:struct statfs
/usr/include/asm/statfs.h:struct statfs {

bits/statfs.hではこんな定義

struct statfs
  {
    int f_type;
    int f_bsize;
#ifndef __USE_FILE_OFFSET64
    __fsblkcnt_t f_blocks;
    __fsblkcnt_t f_bfree;
    __fsblkcnt_t f_bavail;
    __fsfilcnt_t f_files;
    __fsfilcnt_t f_ffree;
#else
    __fsblkcnt64_t f_blocks;
    __fsblkcnt64_t f_bfree;
    __fsblkcnt64_t f_bavail;
    __fsfilcnt64_t f_files;
    __fsfilcnt64_t f_ffree;
#endif
    __fsid_t f_fsid;
    int f_namelen;
    int f_spare[6];
  };

asm/statfs.hではこんな定義

struct statfs {
	long f_type;
	long f_bsize;
	long f_blocks;
	long f_bfree;
	long f_bavail;
	long f_files;
	long f_ffree;
	__kernel_fsid_t f_fsid;
	long f_namelen;
	long f_spare[6];
};

普通は、カーネルモジュール等linux限定で使うものがasm/statfs.hの方を使って、
アプリケーション等移植性をもたせるものはbits/statfs.h(実際はsys/statfs.h経由)の方を使うようで、
まぜて使うことはあまりやらないようだ。
,
Re: 2.2.1 header conflicts
Usually it's best to use the kernel's headers (, , and ) only within the kernel or modules, and the libc's headers only for applications.
'http://www.linuxhq.com/lnxlists/linux-gcc/lg_9902/msg00051.html

とりあえず今回は、asm/statfs.h側を#ifndef〜#endifで囲って控えに回ってもらうことにした(が、これでいいのか?)
STATFS_F_NAMELENを使ったのは、bits/statfs.hの最後に、#define _STATFS_F_NAMELENと書いてあったから。

#ifndef _STATFS_F_NAMELEN
struct statfs {
(略)
};
#endif

_FILE_OFFSET_BITS

gcc -D_FILE_OFFSET_BITS=64 file.c
としてコンパイルするとソース変更無しに2G以上のファイルが扱えるようになるらしい
,
Manpage of FEATURE_TEST_MACROS
_FILE_OFFSET_BITS
このマクロを値 64 で定義すると、ファイル I/O とファイルシステム操作に 関連する 32 ビット版の関数とデータタイプは自動的に 64 ビット版に 変換される。 これは、32 ビットシステムで大きなファイル (> 2 ギガバイト) の I/O を実行する際に役立つ (このマクロを定義すると、コンパイルし直すだけで大きなファイルを 扱えるプログラムを書くことができる)。 64 ビットシステムは、もともと 2 ギガバイトより大きなファイルを 扱えるので、64 ビットシステムではこのマクロは効果を持たない。
'http://www.linux.or.jp/JM/html/LDP_man-pages/man7/feature_test_macros.7.html