2017-04-16 106 views
6

AFAIK {}定義了一個新的範圍,那麼這個定義是什麼?什麼是({});意味着在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

看起來像一個編譯器擴展給我。帶有'-pednatic-errors'的GCC表示錯誤:ISO C++禁止在表達式中使用支撐組[-Wpedantic]'。 – HolyBlackCat

+0

@HolyBlackCat我已經在http://cpp.sh/上測試了這個程序。它編譯得很好 –

+2

GCC默認啓用了一些非標準擴展。 '-pedantic-errors'禁用它們。 '-pedantic'(或'-Wpedantic')使GCC在使用時會產生警告。 Cpp.sh有一個複選框來啓用第二個。 – HolyBlackCat

回答

8

({});不是標準C++的一部分。正如@HolyBlackCat所說的那樣,這是編譯器擴展。使用-pedantic-errors禁用編譯器擴展。

見現場演示hereg++

編譯時,見現場演示herevc++編譯時。

+0

因此,VC在標準方面比GCC更符合標準。那麼,這是第一個。 –

+4

@GillBates:爲什麼是第一個?有關默認情況下啓用的GCC編譯器擴展的更常見示例,請參閱可變長度數組。不幸的是,GCC和VC都需要明確地被告知符合ISO標準(或者儘可能符合標準)。你不能只運行'g ++ program.cpp'或'cl.exe program.cpp',並期望編譯器正常工作。 –

+0

@Christian - 至少對於微軟來說,默認設置一直是*「編譯儘可能多的代碼,所以客戶不會致電產品支持」*。成本效益分析。 :-) –