2016-06-14 14 views
0

次のコードをgcc lfs.c -o lfsでコンパイルすると、何も出力されません。しかし、g ++ lfs.c -o lfsでコンパイルされている場合は、 "stdio.h!で定義された_LARGEFILE_SOURCE"が出力されます。いずれの場合においてもg ++でコンパイルすると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; 
} 

、_LARGEFILE_SOURCEは、コンパイラによって定義されていない。

gcc -dM -E - < /dev/null |grep _LARGEFILE_SOURCE |wc -l 
0 
g++ -dM -E - < /dev/null |grep _LARGEFILE_SOURCE |wc -l 
0 

なぜGCCをg ++フロントエンドを介して呼び出されたとき_LARGEFILE_SOURCEを規定stdio.hのですか?

+0

どのプラットフォームでプログラミングしていますか?あなたはglibcに対してプログラミングしていますか? – fuz

+0

'_LARGEFILE_SOURCE'はとにかく時代遅れですが、なぜあなたはそれが必要だと思いますか?レガシーコード? –

+0

@BaummitAugenこれは廃止されていません。 i386 Linux上でCプログラムをコンパイルすると、デフォルトで32ビットの 'off_t'が得られます。 '_LARGEFILE_SOURCE'はちょっと必要です。 – fuz

答えて

6

g ++は基本的に_LARGEFILE_SOURCEのような他のフィーチャマクロをすべて意味する_GNU_SOURCEを定義しているためです。これらの追加のマクロは、<features.h>ヘッダーが含まれている場合に定義され、ほとんどのシステムヘッダーファイルにはファイルの最初の部分に<features.h>が含まれています。 _GNU_SOURCEがあらかじめ定義されているという事実は、移植性のあるC++コードを書こうとする人にとって絶望的な不満の源です。

私はあなたが簡単にできると信じて:

#undef _GNU_SOURCE 

しかし、これはのlibstdC++を中断します。おお!なんと痛い!これはすべて、C++の最大の設計上の欠陥の1つで、#includeは基本的にテキストのインクルードです。 libstdC++のほとんどはヘッダーファイルに定義されているだけなので、これはあなたのプログラムを_GNU_SOURCEで汚染していることを意味します。

あなたは、あなただけの任意のlibstdC++ヘッダーを使用しないファイルからこれらのインタフェースにアクセスすることができます(完全_GNU_SOURCEによって破壊された例のために、などstrerror_r_GNU_SOURCEによって隠されたインタフェースにアクセスする必要がある場合。

これは私が知る限り、libstdC++にのみ問題があるため、libC++やそれ以外のものを使用することで問題を回避することもできます。

+0

これは本当に奇妙なデザインの決定です。 – fuz

+2

@FUZxxl:私はおそらく "病理学的な"という言葉を使うでしょうが、 "奇妙な"作品です。 –

+0

残忍な選択!私はちょうどこれが事実であると確信し、あなたの答えを受け入れました。 –

関連する問題