14

ラムダを使用するこの C++ 11 コードがあります。これは例です。

#include <iostream>

using namespace std;

int main()
{
    auto func = [] () { cout << "Hello world"; };
    func(); // now call the function
}

このコードを clang 3.1 ( Apple clang version 3.1 (tags/Apple/clang-318.0.54) (based on LLVM 3.1svn)) でコンパイルすると、このエラーが発生しました。

lambda.cpp:7:17: error: expected expression
auto func = [] () { cout << "Hello world"; };

何が間違っている可能性がありますか? このサイトでは、ラムダはclang 3.1でサポートされているようです。

追加した

-std=gnu++11 または c++11 オプションを使用すると、これらのエラー メッセージが表示されます。

0.      Program arguments: /usr/bin/clang -cc1 -triple x86_64-apple-macosx10.7.4 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name lambda.cpp -pic-level 1 -mdisable-fp-elim -relaxed-aliasing -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 128.2 -resource-dir /usr/bin/../lib/clang/3.1 -fmodule-cache-path /var/folders/ng/h2hkycqd2q5g2hz42c47bt4w0000gn/T/clang-module-cache -std=gnu++11 -fdeprecated-macro -fdebug-compilation-dir /Users/smcho/Desktop/C++test -ferror-limit 19 -fmessage-length 173 -stack-protector 1 -fblocks -fobjc-runtime-has-arc -fobjc-runtime-has-weak -fobjc-dispatch-method=mixed -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/ng/h2hkycqd2q5g2hz42c47bt4w0000gn/T/lambda-XvZzHg.o -x c++ lambda.cpp 
1.      lambda.cpp:7:49: current parser token ';'
2.      lambda.cpp:6:1: parsing function body 'main'
3.      lambda.cpp:6:1: in compound statement ('{}')
clang: error: unable to execute command: Segmentation fault: 11
clang: error: clang frontend command failed due to signal 2 (use -v to see invocation)
clang: note: diagnostic msg: Please submit a bug report to http://developer.apple.com/bugreporter/ and include command line arguments and all diagnostic information.
clang: note: diagnostic msg: Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /var/folders/ng/h2hkycqd2q5g2hz42c47bt4w0000gn/T/lambda-roTwCZ.ii
clang: note: diagnostic msg: /var/folders/ng/h2hkycqd2q5g2hz42c47bt4w0000gn/T/lambda-roTwCZ.sh
4

4 に答える 4

21

これは、clang++ がデフォルトで ISO C++ 1998 標準 (ISO C++ 2003 標準で対処された欠陥を含む) を使用してコードをコンパイルするためです (C++11 で削除された「エクスポート」を除く)。

ラムダはClang の C++11 言語拡張の一部であるため、コードを-std=c++11または-std=gnu++11でコンパイルする必要があります

参照: Clang 3.1 および C++11 のサポート状況およびClang での C++11 サポートの有効化

編集: C++ コンパイラ ( clang++ )ではなくC コンパイラ ( clang ) でプログラムをコンパイルしようとしているか、Clang のインストールがlibcまたはlibstdc++にリンクしていないと思います。各ライブラリにリンクして、どのライブラリが機能するかを確認してください。libc がシステムにインストールされていない可能性があります。

clang++実行可能ファイル (C++ コンパイラ)を使用して C++11 モードでプログラムをコンパイルし、Clang C++ 標準ライブラリまたはGNU 標準 C++ ライブラリのいずれかとリンクしてみてください。

1)

# Uses Clang C++ Library and enables C++11 mode
clang++ -stdlib=libc++ -std=c++11 [input] 

2)

# Uses GNU Standard C++ Library and enables C++11 mode
clang++ -stdlib=libstdc++ -std=c++11 [input]

別の考えられる問題は、C++11 言語拡張機能を有効にするための適切なオプションを使用して Clang をコンパイルしていないことです。Clang のコンパイル プロセスを構成するときに使用する正しいフラグについてドキュメントを確認してみてください。

于 2012-11-12T21:42:40.467 に答える
3

Xcode は AppStore を使用して更新されますが、私の Mac (Lion 10.7.5) ではまだクラッシュします。

macport をダウンロードして、サンプルを正常にコンパイルできました。

sudo port install clang-3.1
clang++-mp-3.1 -std=c++11 lambda.cpp 
于 2012-11-13T16:01:53.553 に答える
2

新しく編集された投稿への返信:

この問題を少し調査しましたが、のリリースバージョンで修正されたバグですclang 3.1。私は現在使用しています:

Debian clang version 3.1-3eudoxos1 (branches/release_31) (based on LLVM 3.1)

ただし、でテストしたところclang 3.0-6ubuntu3、投稿したものと同様のエラーが発生します。

あなたのバージョンはSVNからマークされているので、あなたの問題はそれがプレリリースバージョンの3.1からのものであり、ラムダサポートがまだ完全に実装されていないことだと思います。

ラムダを使用するプロジェクトに取り組んでおり、clangとgccの両方をターゲットにしているため、ラムダがclangで機能することを確認できます。時々発生するコンパイラブームがいくつかあります。ただし、もちろん、与えられた例ほど単純なものはありません。

したがって、私の推奨事項は、clangのバージョンを更新することです。

于 2012-11-13T22:04:00.123 に答える
0

この投稿で説明されているように、コマンドラインツールをインストールする必要がありました-Xcode 4.4にはSubversionが付属していますか?

ここに画像の説明を入力してください

于 2012-11-15T22:36:25.973 に答える