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

时间:2014-10-07 08:40:44

标签: c++ arrays c++11

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[] = { ... };

3 个答案:

答案 0 :(得分:6)

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

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

然后,您可以在std::begin

上使用args

答案 1 :(得分:5)

您可以定义一个简单的类包装器,为您提供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;
}

答案 2 :(得分:3)

  

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

确切的唯一解决方法是什么?没有问题。如果您确实需要一个string的数组,请使用TNAs答案中显示的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一起使用   接受数组。

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