2012-04-08 34 views
19

Tất cả, gần đây tôi đã cố gắng sử dụng các tính năng mới được hỗ trợ bởi C++ 11 và tôi đã viết câu lệnh đó tuy nhiên trình biên dịch đã chạy không thành công.lý do tại sao tôi không thể sử dụng từ khóa tự động trong phiên bản cuối cùng của gcc

auto x = 1; 

lỗi báo cáo liệt kê dưới đây:

D:\DEV\CBCppTest\main.cpp||In function 'int main()':| 
D:\DEV\CBCppTest\main.cpp|22|warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]| 
D:\DEV\CBCppTest\main.cpp|22|error: 'x' does not name a type| 
||=== Build finished: 1 errors, 1 warnings ===| 

Tại sao gcc phiên bản mới nhất 4.7.0 trên MinGW không thể hỗ trợ tuyên bố này. Nhưng trình biên dịch của vs10 đã trôi qua. Bất cứ ai có thể biết lý do cho vấn đề này?

Trả lời

29

"GCC cung cấp hỗ trợ thử nghiệm cho tiêu chuẩn ISO C++ 2011. Hỗ trợ này có thể được bật với tùy chọn trình biên dịch -std = C++ 11 hoặc -std = gnu ++ 11; trước đây sẽ tắt tiện ích GNU".

Nó xuất phát từ đây: c+11 support

+0

cảm ơn, nó đã làm tôi bối rối trong một thời gian dài. –

5

Khi biên dịch, bạn cần phải thêm -std=c++11 để g ++ dòng lệnh.

2

Điều này là do tính năng không được kích hoạt theo mặc định bởi trình biên dịch GCC. Nếu bạn đang sử dụng Codeblocks, hãy chuyển tới Cài đặt -> Trình biên dịch và bật tính năng như được hiển thị - http://imgur.com/KrHx8nh

7

Để giải thích trình biên dịch thực sự phàn nàn về điều gì: auto trước đây là từ khóa C cũ, tuyên bố rằng biến này có bộ nhớ tự động. Những từ khóa này ít có liên quan đến hệ thống kiểu, chúng chỉ rõ cách biến được biểu diễn trong bộ nhớ: nơi chúng được lưu trữ (đăng ký bộ xử lý so với bộ nhớ chính/ngăn xếp) và cách bộ nhớ được khai hoang. auto có nghĩa là biến được lưu trữ trên ngăn xếp (mặc dù bộ xử lý có thể tối ưu hóa nó vào thanh ghi bộ xử lý) và bộ nhớ là tự động được khôi phục khi biến nằm ngoài phạm vi - đó là lựa chọn đúng trong hầu hết mọi trường hợp và do đó, mặc định, hầu như không ai từng sử dụng từ khóa cũ auto này. Tuy nhiên, C++03 vẫn cung cấp khả năng tương thích ngược cho mã có; các trình biên dịch ngày nay vẫn muốn hỗ trợ mã kế thừa.


Mặc dù thường xuyên bạn muốn đối tượng cư trú trên heap, bạn vẫn sẽ được tiếp cận những thông qua các biến trên stack; C++ có các phương pháp riêng của mình khi sử dụng bộ nhớ phân bổ heap (new, std::vector, v.v.), bạn không cần các công cụ kiểu C malloc không an toàn.

1

Để tôi thêm "-std = C++ 0x" "vào dòng lệnh g ++ đã khắc phục được sự cố.

Các vấn đề liên quan