42

g++ 4.8.1 および c++11 モードの clang >= 3.3 で正しくコンパイルおよび実行されるプロジェクトがあります。ただし、実験-std=c++1yモードに切り替えると、clang 3.3 (ただし g++ ではない)<cstdio>は、Boost.Test を介して間接的に含まれるヘッダーをチョークします (そのため、自分で簡単に変更することはできません)。

// /usr/include/c++/4.8/cstdio
#include <stdio.h>

// Get rid of those macros defined in <stdio.h> in lieu of real functions.
// ...
#undef gets
// ...    

namespace std
{
// ...
using ::gets; // <-- error with clang++ -std=c++1y
// ...
}

次のエラー メッセージが表示されます。

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/cstdio:119:11: エラー: グローバルに「gets」という名前のメンバーがありません名前空間

最新の C++ 環境をセットアップする方法に関するこのチュートリアルでは、同様のルックアップの問題が発生max_align_tします。sed スクリプトを使用して未知のシンボルをマクロで囲むことをお勧めし#ifdef __clang__ますが、それは脆弱なアプローチのようです。

セットアップ: プレーンな 64 ビット Linux Mint 15 と

g++ (Ubuntu 4.8.1-2ubuntu1~13.04) 4.8.1

Ubuntu clang バージョン 3.3-3~raring1 (branches/release_33) (LLVM 3.3 ベース)

質問:

  • このエラーの原因は何ですか? 問題のコードの近くにはどこにもマクロはなく__clang__、c++11 モードでの clang はまったく問題ありません。
  • stdそれは言語の問題ですか (C++14 は、C 互換シンボルをグローバルから名前空間にインポートすることについて、C++11 以外のことを言っていますか)?
  • インクルード パスで何かを変更する必要がありますか? (私は CMake を使用してヘッダー パスを自動的に選択し、CMakeLists.txt 内でモードを切り替えます)
  • clang にはこれを解決するためのスイッチがありますか?
4

1 に答える 1