definicja tablic - czy jej rozmiar musi być stałą?

0

Witam, mam takie pytanie, gdyż w podręczniku, z którego się uczę jest wiadomość, iż przy definiowaniu tablicy jej rozmiar musi być już znany podczas kompilacji tzn. musi być stałą całkowitą np. constexpr. Jednak, mi działa jak używam zwykłej zmiennej.

#include <iostream>

using namespace std;

int main(){
    int x;
    cin >> x;
    int tab[x];
    cout << "Tablica ma  = " <<  sizeof(tab) / sizeof(int) << " elementow" << endl;
} 

W zależności co wpiszę do zmiennej x kompilator tworzy mi właśnie tablice o takim rozmiarze i nie wyskakują żadne błędy. Więc moje pytanie jest takie czy można to normalnie stosować, czy jednak powinno się unikać tego?

5

@4matey: To jest tablica VLA z C, kompiluje się przez przypadek, nie używać.

4

C++ rozmiar tablicy ma być stały.
Od C99 wprowadzono VLA.

Teraz większość kompilatorów domyślnie pozwala na mieszani C z C++, ergo VLA masz domyślnie dostępne.
Wyjątkiem jest MSVC bo z powodów wstecznej kompatybilności nie wspiera VLA i nie twierdzi, że wspiera C99
https://stackoverflow.com/a/48983723/1387438

Począwszy od C++11 rekomendowane jest używać std::array zamiast C-array.
W C++ VLA powinno być zastąpione przez std::vector.

3
Cepo napisał(a):

@4matey: To jest tablica VLA z C, kompiluje się przez przypadek, nie używać.

Kompiluje się absolutnie nie przez przypadek, tylko przez rozszerzenie składni obecne w niektórych kompilatorach (GCC, Clang) a nieobecne np. w MSVC.
Jeśli kompatybilność z MSVC nie jest ważna to można używać. Czy powinno się, to inna sprawa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1