0

次のコードを 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

GCC が g++ フロントエンド経由で呼び出されると、stdio.h が _LARGEFILE_SOURCE を定義するのはなぜですか?

4

1 に答える 1

6

g++ は を定義するため_GNU_SOURCE、これは基本的に などの他のすべての機能マクロを意味します_LARGEFILE_SOURCE。これらの追加のマクロは、<features.h>ヘッダーがインクルードされるときに定義され、ほとんどのシステム ヘッダー ファイルにはファイル<features.h>の非常に早い段階でインクルードされます。事前定義されているという事実_GNU_SOURCEは、移植可能な C++ コードを作成したい人にとって、フラストレーションの原因となります。

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

#undef _GNU_SOURCE

ただし、これは libstdc++ を壊します。痛い!なんて痛い!これはすべて、C++ の最大の設計上の欠陥の 1 つに起因しています。これは、#include基本的にテキストのインクルージョンであるという事実です。ほとんどの libstdc++ はヘッダー ファイルで定義されている (宣言されているだけではない!) ため、プログラムが_GNU_SOURCE.

によって隠されているインターフェイス_GNU_SOURCE(strerror_rたとえば、 によって完全に壊れている_GNU_SOURCE) にアクセスする必要がある場合は、libstdc++ ヘッダーを使用しないファイルからのみ、これらのインターフェイスにアクセスできます。

これは私が知る限り libstdc++ のみの問題なので、libc++ などを使用することで問題を回避できると思います。

于 2016-06-14T23:04:36.373 に答える