2011-12-03 26 views
8

Tạo một mảng trên stack với kích thước xác định tại thời gian chạy được phép theo mặc định với g ++:Cờ g ++ nào sẽ tạo ra một mảng có kích thước thời gian chạy trên stack gây ra lỗi trình biên dịch?

int size; 
cout << "Enter array size: " 
cin >> size; 
MyObject stack_array[size]; 

câu trả lời Theo các this question, đó là một ý tưởng tồi và tôi đồng ý. Rõ ràng tôi sẽ có thể sử dụng cờ g ++ để thực thi nghiêm ngặt/chuẩn C++ và nhận được lỗi trình biên dịch. Mã vẫn biên dịch ngay cả với các cờ sau:

g++ -ansi -pedantic -Wall -Wextra -Werror -std=c++0x 

Làm cách nào để ngăn mã này được biên dịch?

Dưới đây là thông tin phiên bản của tôi:

g++ -v 
Using built-in specs. 
COLLECT_GCC=g++ 
COLLECT_LTO_WRAPPER=/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/lto-wrapper 
Target: i686-linux-gnu 
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.5.2-8ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.5/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.5 --enable-shared --enable-multiarch --with-multiarch-defaults=i386-linux-gnu --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib/i386-linux-gnu --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.5 --libdir=/usr/lib/i386-linux-gnu --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-gold --enable-ld=default --with-plugin-ld=ld.gold --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu 
Thread model: posix 
gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) 
+2

gì phiên bản của GCC? – Hauleth

+0

thông tin phiên bản đã thêm – Pete

+0

'-ansi' xung đột với' -std = C++ 0x'. Trong chế độ C++ '-ansi' có nghĩa là' -std = C++ 98'. Không phải là câu trả lời vì lỗi sẽ được tạo ở cả hai chế độ. –

Trả lời

3

Trên máy tính của tôi (Arch Linux, GCC 4.6.2) sử dụng g++ -pedantic file.cpp lợi nhuận

test.cpp: In function ‘int main()’: 
test.cpp:7:12: warning: ISO C++ forbids variable length array ‘arry’ [-Wvla] 
+0

-pantic cho cảnh báo; việc bổ sung -Werror giữ nó khỏi biên dịch. Nó chỉ ra các tùy chọn ban đầu của tôi sẽ làm việc nếu makefile của tôi đã thực sự biên dịch các tệp nguồn bằng cách sử dụng các tùy chọn đó (oops). Khi nó bật ra, những lựa chọn đó chỉ được sử dụng để liên kết. : o Một khi tôi cố định makefile nó làm việc tốt. – Pete

5

Nâng cấp trình biên dịch của bạn (cần thiết để hỗ trợ -Wvla cờ, bạn có thể tìm kiếm nó trong ghi thay đổi hoặc chỉ nâng cấp lên 4.6.2). 4.6 sẽ chính xác từ chối nó:

> g++ -std=c++0x -Wall -Werror -pedantic -o vla.exe vla.cpp 
vla.cpp: In function 'int main()': 
vla.cpp:3:19: error: ISO C++ forbids variable length array 'array' [-Werror=vla] 
vla.cpp:3:9: error: unused variable 'array' [-Werror=unused-variable] 
cc1plus.exe: all warnings being treated as errors 

Ngoài ra, -ansi cũng giống như -std=c++98, do đó, không sử dụng lá cờ rằng nếu bạn muốn C++ 11.

+0

Phiên bản 4.4.4 chẩn đoán chính xác lỗi này cho tôi. –

+0

Tuy nhiên, nâng cấp lên 4.6 là một ý tưởng hay, đặc biệt nếu bạn muốn C++ 11. –

+2

Điều đó có thể đúng, nhưng trừ khi có một hồi quy cụ thể trong 4.5.2 nó không thực sự giải thích việc thiếu sai sót trong trường hợp của OP. –

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