【发布时间】:2017-02-15 08:16:23
【问题描述】:
据我了解,当我们定义像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()]; 似乎使用了仅在运行时才知道的大小。这是因为这个数组是在一个函数中定义的,它将在堆栈中分配数组,还是因为编译器可以在编译时计算出大小?
【问题讨论】:
-
一些编译器支持(作为扩展)堆栈上的数组,其大小只有在运行时才知道。
-
作者期望任何 C++ 编译器构建此代码都支持非标准功能(可变长度数组,VLA)。
-
一个
std::list用于累积可变参数,然后用于创建 VLA 并复制那里的所有内容?这垃圾到底是谁写的?我不想再用这部手机了…… -
@MatteoItalia 同意。我会使用
std::vector<const char*>并扔掉 bothstd::list和 VLA。