2011-12-03 9 views
8

Tworzenie tablicy na stosie do wielkości określonej w czasie wykonywania jest domyślnie dozwolone z g ++:Jakie flagi g ++ powodują, że tablica wielkości runtime na stosie powoduje błąd kompilatora?

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

Według odpowiedzi na this question, że to zły pomysł i zgadzam się. Wygląda na to, że powinienem móc używać flagi g ++ w celu wymuszenia ścisłego/standardowego C++ i uzyskania błędu kompilatora. Kod nadal kompiluje się nawet z następującymi flagami:

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

Jak mogę zapobiec kompilacji tego kodu?

Oto moja informacji version:

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

Jaka wersja GCC? – Hauleth

+0

informacje o wersji dodane – Pete

+0

'-ansi' konflikty z' -std = C++ 0x'. W trybie C++ "-ansi" oznacza to samo co '-std = C++ 98'. Brak odpowiedzi, ponieważ błąd powinien być generowany w obu trybach. –

Odpowiedz

3

Na moim komputerze (Arch Linux GCC 4.6.2) stosując g++ -pedantic file.cpp powraca

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

-pedantic daje ostrzeżenie; dodanie -Werror zapobiega kompilacji. Okazuje się, że moje oryginalne opcje zadziałałyby, gdyby mój plik Makefile rzeczywiście kompilował pliki źródłowe, używając tych opcji (ups). Jak się okazało, te opcje były używane tylko do połączenia. : o Po naprawieniu pliku makefile działało dobrze. – Pete

5

Upgrade kompilator (to musi obsługiwać -Wvla flagę, można polować na niego w Changelog lub po prostu upgrade do 4.6.2). 4.6 będzie poprawnie odrzucić go:

> 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 

Również -ansi jest taka sama jak -std=c++98, więc nie korzystać z tej flagi jeśli chcesz C++ 11.

+0

Wersja 4.4.4 poprawnie diagnozuje ten błąd dla mnie. –

+0

Cóż, aktualizacja do wersji 4.6 jest dobrym pomysłem, szczególnie jeśli chcesz C++ 11. –

+2

To może być prawdą, ale jeśli nie było określonego regresu w 4.5.2, tak naprawdę nie wyjaśnia to braku błędu w przypadku PO. –

Powiązane problemy