2017-02-15 6 views
7

Wie ich es verstehe, wenn wir ein Array wie const char argv[SIZE]; definieren "SIZE" muss eine Zahl sein, die zur Kompilierzeit bekannt ist.define Array mit unsicherer Größe

Aber vor kurzem las ich AOSP Code, und fanden diese: 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()]; 
    ... 

Es scheint, dass const char* argv[argsList.size()]; eine Größe verwendet, die erst zur Laufzeit bekannt ist. Liegt das daran, dass dieses Array in einer Funktion definiert ist, die das Array im Stack zuweist, oder weil der Compiler herausfinden kann, wie groß die Größe zur Kompilierzeit ist?

+0

Einige Compiler unterstützen (als Erweiterung) Arrays auf dem Stack mit einer Größe, die nur zur Laufzeit bekannt ist. – BoBTFish

+1

Der Autor erwartet eine nicht standardmäßige Funktion (variable length arrays, VLAs), die von dem C++ - Compiler unterstützt wird, der diesen Code erstellt. – WhozCraig

+3

Eine 'std :: list', die verwendet wird, um varargs zu akkumulieren, wird dann verwendet, um ein VLA zu erstellen und alles dort zu kopieren? Wer zum Teufel hat diesen Müll geschrieben? Ich möchte dieses Telefon nicht mehr benutzen ... –

Antwort

0

Die korrekte Terminologie ist Variable-length-array (VLA).

Der C++ - Sprachstandard unterstützt diese Funktion nicht.

Der C-Sprachen-Standard begann es irgendwann zu unterstützen.

Zuordnung im Speicher ist Compiler-abhängig (d. H. Nicht durch den Standard diktiert).

+0

Sie sollten angeben, dass, selbst wenn Standard-C++ es nicht unterstützt, es eine gemeinsame Erweiterung ist (sowohl von gcc als auch von clang unterstützt). –

+0

@MatteoItalia: OK, guter Punkt. Ich habe mich natürlich auf den allgemeinen Standard bezogen. Ihr Kommentar hier wird dies für mich tun (da ich nicht sicher bin, was andere C++ - Compiler dies unterstützen). Danke :) –

+0

Gcc und Clang, aber * nicht * MSVC - was je nach Zielplattform ein Problem sein kann. –