私が理解しているように、const char argv[SIZE];
のような配列を定義すると、 "SIZE"はコンパイル時に知られている数値でなければなりません。不確定なサイズの配列を定義する
しかし、最近、私はAOSPコードを読んで、これを見つけた: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()];
...
const char* argv[argsList.size()];
は、実行時にのみ知られているサイズを使用しているようです。これは、この配列がスタックに配列を割り当てる関数で定義されているか、またはコンパイラがコンパイル時のサイズを把握できるためですか?
一部のコンパイラは、実行時にのみ判明しているサイズのスタック上の配列を(拡張子として)サポートしています。 – BoBTFish
著者は、このコードを構築しているC++コンパイラがサポートしている非標準機能(可変長配列、VLA)を期待しています。 – WhozCraig
varargsを蓄積するために使用される 'std :: list'は、次にVLAを作成し、そこにすべてをコピーするために使用されますか?誰がこのゴミを書きましたか?私はもうこの電話を使いたくない... –