2017-04-16 10 views
6

私の知る限り{}は、新しいスコープを定義し、これは何を定義していますか?({})は何ですか; C++の意味ですか?

({}); 

コンパイラはよくこのプログラムをコンパイル:私は();({});を交換した場合

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string name; 
    std::cout << "What is your name? "; 
    { 
    ({}); 
    } 
    getline (std::cin, name); 
    std::cout << "Hello, " << name << "!\n"; 
} 

コンパイラは、プログラムのコンパイルに失敗しました。

なぜ({});はうまく動作しますが、();ないのですか?

私はcpp.sh.上のプログラムをテストしてきましたそれはうまくコンパイルされます。

+6

私にはコンパイラの拡張機能のように見えます。 GCCの '-pednatic-errors'は' error:ISO C++は式[-Wpedantic] '内のブレースされたグループを禁止しています。 – HolyBlackCat

+0

@HolyBlackCat http://cpp.sh/でプログラムをテストしました。それはうまくコンパイルされます –

+2

GCCにはデフォルトでいくつかの非標準拡張が有効になっています。 '-pedantic-errors'はそれらを無効にします。 '-pedantic'(または' -Wpedantic')は、GCCが使用されたときに警告を生成させます。 Cpp.shには、2番目のチェックボックスを有効にするチェックボックスがあります。 – HolyBlackCat

答えて

8

({});は、標準C++の一部ではありません。 @HolyBlackCatによって正しく述べられているように、これはコンパイラ拡張です。コンパイラ拡張を無効にするには-pedantic-errorsを使用してください。 vc++上でコンパイルするとき

g++

でコンパイル時にライブデモhereを参照してくださいライブデモhereを参照してください。

+0

ので、VCはGCCの標準単位よりもラインでより多くのである使用される少なくとも三つの異なるコンテキストがあります。まあ、それが最初です。 –

+4

@GillBates:なぜそれが最初ですか?デフォルトで有効になっているGCCコンパイラ拡張のより一般的な例については、可変長配列を参照してください。残念なことに、GCCとVCの両方が、ISOに準拠していることを明示的に伝える必要があります(または可能な限り準拠しているようにしてください)。単に 'g ++ program.cpp'や' cl.exe program.cpp'を実行して、コンパイラが正しく動作することは期待できません。 –

+0

@Christian - 少なくともMicrosoftの場合、デフォルト設定は常に「*できるだけ多くのコードをコンパイルするので、顧客は製品サポートを呼び出さない」*。費用便益分析。 :-) –

関連する問題