【问题标题】:define array with unsure size [duplicate]定义大小不确定的数组[重复]
【发布时间】: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&lt;const char*&gt; 并扔掉 both std::list 和 VLA。

标签: c++ arrays


【解决方案1】:

正确的术语是可变长度数组 (VLA)。

C++ 语言标准不支持此功能。

C 语言标准在某个时候开始支持它。

内存分配取决于编译器(即不受标准规定)。

【讨论】:

  • 您应该指定,即使标准 C++ 不支持它,它也是一个通用扩展(gcc 和 clang 都支持)。
  • @MatteoItalia:好的,好点。当然,我指的是一般标准。您在这里的评论将为我做这件事(因为我不确定其他 C++ 编译器是否支持这一点)。谢谢你:)
  • Gcc 和 clang,但 不是 MSVC - 这可能是一个问题,具体取决于您的目标平台。
  • @MartinBonner:我没有关于每个编译器的具体信息(更不用说每个future 编译器了)。这就是为什么我更愿意让这个答案与平台无关。任何使用它的人都应该检查他们的特定编译器。
  • 是的。我的偏好是避免使用扩展(除了像__attribute__(format(printf)) 这样添加额外编译器警告的东西,并且可以隐藏在#ifdef 后面)。特别是当 C++ 中已经有一个非常好的等价物时:std::vector.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
相关资源
最近更新 更多