有没有办法避免数组到指针衰减

Is there a way to avoid array-to-pointer decay?

本文关键字:指针 衰减 数组 有没有      更新时间:2023-10-16

main char* argv[]的参数衰减为 char** ,这是不幸的,因为它不能与只接受数组的std::begin一起使用。我看到的唯一解决方法是使用不可取的可变长度数组。

#include <iostream>
int main(int argc, char* argv[])
{
    char* _argv[argc];
    for (int i = 0; i < argc; ++i)
        _argv[i] = argv[i];
    for (arg : _argv)
    {
        std::cout << arg << " ";
    }
    return 0;
}

我希望我想要这样的东西:char* _argv[] = { ... };

这是不可能的,因为 main 的签名是固定的。您可以使用以下命令将元素复制到vector

std::vector<std::string> args {argv, argv + argc};

然后,您可以在args上使用std::begin

您可以定义一个简单的类包装器来为您提供begin()end()

struct Args {
    int argc_;
    char **argv_;
    Args (int argc, char *argv[]) : argc_(argc), argv_(argv) {}
    char ** begin () { return argv_; }
    char ** end () { return argv_ + argc_; }
};
int main(int argc, char *argv[]) {
    for (auto s : Args(argc, argv)) {
        std::cout << s << 'n';
    }
    return 0;
}

我看到的唯一解决方法是使用可变长度数组,即 不良。

唯一的解决方法到底是什么?没有问题。如果您确实需要 string 的数组,请使用 TNA 答案中所示的vector;我怀疑您是否需要修改参数。
如果您只需要遍历它,则无需复制所有指针。

for (auto str : boost::make_iterator_range(argv, argv + argc))
    std::cout << str;

for (auto ptr = argv; ptr != argv + argc; ++ptr)
    std::cout << *ptr << 'n';

main char* argv[]的参数衰减为 char** ,即 不幸的是,因为它不能与std::begin一起使用 接受数组。

没有其他办法。命令行参数的数量在编译时是未知的,这种传递它们的方法(而不是使用两个指针到指针(是出于历史动机。