2017-02-15 15 views
7

Jak rozumiem, kiedy definiujemy tablicę taką jak const char argv[SIZE]; "ROZMIAR" musi być liczbą znaną w czasie kompilacji.zdefiniować tablicę z niepewnym rozmiarem

Ale ostatnio czytałem kod AOSP, i znalazłem to: http://androidxref.com/5.1.1_r6/xref/system/netd/server/NetdConstants.cpp#70

static int execIptables(IptablesTarget target, bool silent, va_list args) { 
    /* Read arguments from incoming va_list; we expect the list to be NULL terminated. */ 
    std::list<const char*> argsList; 
    argsList.push_back(NULL); 
    const char* arg; 
    do { 
     arg = va_arg(args, const char *); 
     argsList.push_back(arg); 
    } while (arg); 

    int i = 0; 
    const char* argv[argsList.size()]; 
    ... 

Wydaje się, że const char* argv[argsList.size()]; używa rozmiaru, który jest znany tylko w czasie wykonywania. Czy to dlatego, że ta tablica jest zdefiniowana w funkcji, która przydzieli tablicę w stosie lub ponieważ kompilator może dowiedzieć się, jaki jest rozmiar w czasie kompilacji?

+0

Niektóre kompilatory obsługują (jako rozszerzenie) tablice na stosie o rozmiarze znanym tylko w środowisku wykonawczym. – BoBTFish

+1

Autor oczekuje, że niestandardowy element (tablice o zmiennej długości, VLA) będzie obsługiwany przez dowolny kompilator C++ budujący ten kod. – WhozCraig

+3

"Std :: list" używane do gromadzenia varargs następnie używane do tworzenia VLA i skopiować wszystko tam? Kto do cholery napisał te śmieci? Nie chcę już używać tego telefonu ... –

Odpowiedz

0

Prawidłowa terminologia to o zmiennej długości tablicy (VLA).

Standard języka C++ nie obsługuje tej funkcji.

Standard języka C zaczął go wspierać w pewnym momencie.

Przydział w pamięci jest zależny od kompilatora (tj. Nie jest dyktowany przez standard).

+0

Należy określić, że nawet jeśli standardowe C++ go nie obsługuje, jest to typowe rozszerzenie (obsługiwane zarówno przez gcc, jak i clang). –

+0

@ MatteoItalia: OK, dobry punkt. Miałem na myśli ogólny standard. Twój komentarz tutaj zrobi to za mnie (ponieważ nie jestem pewien, co obsługują to inne kompilatory C++). Dziękuję :) –

+0

Gcc i clang, ale * nie * MSVC - co może być problemem w zależności od platformy docelowej. –