在代码中创建 argc argv [重复]

Posted

技术标签:

【中文标题】在代码中创建 argc argv [重复]【英文标题】:create argc argv in the code [duplicate] 【发布时间】:2017-02-14 10:58:36 【问题描述】:

你好,新手问题,但我就是想不通:

我有一个名为 bar 的函数

class foo

    public:
        bool bar(int argc, char** argv);

argv 应该包含

"--dir" and "/some_path/"

如何创建 argv 和 argc 以便将它们传递给 bar() ?我尝试了很多方法,但我无法正确地进行指针和类型转换。

所以我不想从命令行获取 argv,而是想在代码中创建它。

感谢您的任何意见!

【问题讨论】:

你创造的??不!您可以通过 argv 将参数传递给您的程序。 argc 是传入的参数数量。argv 可以保存任何值、路径... @Raindrop7,有时您必须在程序中创建 argc 和 argv。例如,如果你想使用 boost 单元测试,你最终会调用 main。在 android 上(如果你想在设备上运行测试)你必须自己调用它并且你必须为它形成参数。 【参考方案1】:

我最喜欢的方式是这样的:

std::vector<std::string> arguments = "--dir", "/some_path";

std::vector<char*> argv;
for (const auto& arg : arguments)
    argv.push_back((char*)arg.data());
argv.push_back(nullptr);

f.bar(argv.size() - 1, argv.data());

注意,如果参数是静态的并且不会改变,那么这有点过分了。但是这种方法具有符合 RAII 的优点。它为您管理内存并在适当的时候删除对象。所以如果参数列表是动态的,那么它是最干净的方式。

除此之外,如果f.bar 修改了 argv 数组中的数据,则此代码在技术上是 UB。通常情况并非如此。

【讨论】:

再次从const char *隐式转换为char * 我已经明确转换并添加了关于 UB 的通知。 对于 c++11,您可以使用左值引用和 &amp;arg[0] 而无需任何强制转换。无论如何,我更喜欢 const_cast&lt;&gt; 而不是 C 风格的演员。 您在for (const auto&amp; arg : arguemnts) 中有错字应该是arguments 谢谢你,伊万。我已经修正了错字。【参考方案2】:

假设您希望传递给main 的 argc 和 argv 格式相同,您可以这样调用它:

foo f;
char *args[] = 
    (char*)"--dir",
    (char*)"/some_path/",
    NULL
;
f.bar(2, args);

(注意:这假定bar 不会修改参数字符串 - 在这种情况下,您应该将参数类型更改为const char ** 而不是char **

【讨论】:

在 c++ 中从 const char * 转换为 char * 是非法的 段错误!没有分配 argv @Slava 不,不是。如果通过强制转换显式转换,则该转换在所有 C++ 版本中均有效。在 C++11 之前,转换也可以隐式执行,但仅限于字符串文字(this answer有)。只有修改指向字符串的尝试是无效的。 @Raindrop7 argv 是一个指针数组。数组在堆栈上,不需要分配。指针是指向位于数据段中的常量的指针。也不需要分配。 @AlexeyGuseynov 是的,您可以将参数传递给其他函数,甚至 main 例如在 winmain 中返回对传递给它的 argc 和 argv 的 main 的调用。【参考方案3】:

使用类字符串太强大了:

#include <iostream>
#include <string>

class foo

    public:
        void bar(int argc, std::string* argv);
;

void foo::bar(int argc, std::string* argv)

    //do somwthing
    for(int i(0); i < argc; i++)
        std::cout << "argv[" << i << "]: " << argv[i] << std::endl;



int main()



    int argc;
    std::cout << "Enter number of parameters: ";
    std::cin >> argc;
    std::cout << std::endl;
    std::cin.ignore(1, '\n');

    std::string* sArgv = new std::string[argc];

    for(int i(0); i < argc; i++)
    
        std::cout << "argv[" << i << "]: ";
        std::getline(std::cin, sArgv[i]);
        std::cout << std::endl;
        std::cin.ignore(1, '\n');
    


    foo theFoo;
    theFoo.bar(argc, sArgv);

    delete[] sArgv;
    sArgv = NULL;

    std::cout << std::endl;

    return 0;

【讨论】:

以上是关于在代码中创建 argc argv [重复]的主要内容,如果未能解决你的问题,请参考以下文章

int main(int argc,char** argv)[重复]

iOS - 在没有 xib 的项目中创建 xib

如何在 QT 中创建比主线程高优先级的线程

关于'main(int argc,char *argv [])'[重复]

用字符串填充argv(并获取argc)以传递给其他方法[重复]

Bash中的Argc和Argv [重复]