読者です 読者をやめる 読者になる 読者になる

ソフトウェアエンジニア現役続行

雑多なことを綴ります

header競合

C言語

asm/statfs.h と sys/statfs.h を両方インクルードすると、headerがコンフリクト(競合)してコンパイルできません。

次のように asm/statfs.h と sys/statfs.h をインクルードして・・・、

[Oswald@fedora tmp]$ cat conflict_headers.c
#include
#include
int main(void)
{
  return 0;
}

次のようにコンパイルをすると、headerがコンフリクトしてエラーになります。

[Oswald@fedora tmp]$ gcc -Wall -Werror -o conflict_headers conflict_headers.c
In file included from /usr/include/asm/statfs.h:11,
        from conflict_headers.c:2:
/usr/include/asm-generic/statfs.h:22: error: redefinition of ‘struct statfs’

二つのヘッダファイルで定義する struct statfs が異なっているからです。RedHat7.3(glibc-2.96)のときはコンパイルが通ったのですが、最近の環境ではコンパイルが通りません。

普通のユーザランドのプログラムの場合は、asm/statfs.hは使わずにsys/statfs.hを使うべきだそうです。カーネルモジュール等linux限定で使うものがasm/statfs.hの方を使って、アプリケーション等移植性をもたせるものはbits/statfs.h(実際はsys/statfs.h経由)の方を使うようで、まぜて使うことはあまりやらないようです。

せっかくユーザランドのAPIを用意してくれているんだから、そちら(sys/statfs.h)を使うのが筋なのは分かります。でもglibcの実装もおかしい。同じ名前の構造体を別で定義するのはどうかと思います・・・。