Czy C++ obsługuje tablice o zmiennej długości?
Nie, czekaj, wytrzymaj ze mną...
VLAs zawsze były rozszerzeniem GCC, ale zostały przyjęte przez C99:
[C99: 6.7.5.2/4]:
Jeśli rozmiar nie jest obecny, typ tablicy jest niekompletny Typ. Jeśli rozmiar jest * zamiast wyrażenia, Typ array to typ tablicy o zmiennej długości o nieokreślonym rozmiarze, który mogą być używane tylko w deklaracjach z zakresem prototypu funkcji; takie tablice są jednak kompletnymi typami. Jeśli rozmiar jest liczbą całkowitą wyrażenie stałe i Typ elementu ma znaną stałą wielkość, typ tablicy nie jest typem tablicy o zmiennej długości; w przeciwnym razie, typ tablicy jest typem tablicy o zmiennej długości.
C99 jest również znany jako ISO/IEC 9899:1999
.
Teraz:
[C++11: 1.1/2]:
C++ jest językiem programowania ogólnego przeznaczenia opartym na w języku programowania C określonym w ISO/IEC 9899:1999 (zwana dalej normą C). Oprócz obiekty dostarczane przez C, C++ dostarcza dodatkowe typy danych, klasy, szablony, wyjątki, przestrzenie nazw, przeciążenie operatora, nazwa funkcji przeciążenia, referencje, bezpłatne zarządzanie sklepem i dodatkowe wyposażenie biblioteki.
czy C++11 też nie powinno mieć VLAs?
4 answers
To swobodne sformułowanie nie oznacza, że wszystko i wszystko w C99 jest w C++11. To, co zacytowałeś, to tylko tekst wprowadzający.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-19 00:40:48
C99 może być również używany w C++, ale nie może być używany w C++, ponieważ nie może być używany w C++.]}
[C++11: 8.3.4/1]
: w deklaracjiT D
GdzieD
ma postać
D1
[ stała-wyrażenieopt ] atrybut-specifier-seqopt[..]
Jest to jedyna składnia deklaracji array, którą otrzymujemy w C++.
Zauważ, że żadna wzmianka o tej różnicy nie jest podane w klauzuli "zgodność Z C" C.1
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-21 17:14:46
Definicja wyrażenia stałego jest inna dla obu języków.
const size_t size = 5;
int array[size]; // array in C++, VLA in C
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-21 17:49:09
To kompiluje dla mnie: (g++ 4.6 z -std=c++0x
). Ale nie kompiluje się z -pedantic
(dzięki @ MarkB). Zamiast tego ostrzega, że " szablon.cpp: 7: 12: warning: ISO C++ forbids variable length array ' n ' [- Wvla]"
int main(int argc, char ** argv) {
int n[argc];
}
Tak więc rozmiar n
nie może być znany w czasie kompilacji przez kompilator. czy jest to rozszerzenie GNU do C++? to wydaje się być rozszerzeniem GNU, i że VLAs nie są oficjalną częścią C++11.
(oczywiście, po prostu bawię się kompilatorem. Więc weź to ze szczyptą soli.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-21 18:10:13