在 C++ 中访问命令行参数

gri*_*rom 3 c++

是否可以在不通过 int main(int, char**) 接收命令行参数的情况下获取它们?我不想将参数传递给多个方法,因此全局函数将是完美的。另外,我不想通过全局变量自己存储参数。我正在运行 Windows 和 Linux。

编辑: 示例:

int main()
{
   int argc = GetArgumentCount();
   char ** argv = GetArguments();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑: 可以使用LPTSTR WINAPI GetCommandLine(void); 在win32中。

https://msdn.microsoft.com/en-us/library/ms683156(v=vs.85).aspx

我正在寻找 Linux 中的等效功能。

Chr*_*ckl 5

是否可以获取命令行参数而不通过 接收它们int main(int, char**)

是的,具有特定于平台的功能。但这不是必需的(见下文)。

我不想将参数传递给多个方法,

这是可以理解的。这是一种反模式,也称为“tramp data”。

另外,我不想通过全局变量自己存储参数。

是的,全局变量很少是一个好主意。

这是另一种方法:将它们作为static本地容器对象存储在一些全局可用的非成员函数中,该函数通过引用返回容器。

例子:

#include <iostream>
#include <string>
#include <vector>

std::vector<std::string>& Arguments()
{
    static std::vector<std::string> arguments;
    return arguments;
}

void f()
{
    // use arguments anywhere else:
    std::cout << Arguments()[0];
}

int main(int argc, char* argv[])
{
    for (int i = 0; i < argc; ++i)
    {
        Arguments().push_back(argv[i]);
    }

    f();
}
Run Code Online (Sandbox Code Playgroud)

当然,这可以做得更复杂。例如,您可能希望main通过将向量包装在一个类中并声明main为 a来防止其他任何人更改向量friend,如下所示:

#include <iostream>
#include <string>
#include <vector>

class Arguments final
{
public:
    static int Count()
    {
        return arguments.size();
    }

    static std::string Get(int index)
    {
        return arguments[index];
    };

private:
    Arguments() = delete;
    friend int main(int argc, char* argv[]);
    static std::vector<std::string> arguments;
};

std::vector<std::string> Arguments::arguments;

void f()
{
    // use Arguments anywhere else:
    std::cout << Arguments::Get(0);
}

int main(int argc, char* argv[])
{
    for (int i = 0; i < argc; ++i)
    {
        Arguments::arguments.push_back(argv[i]);
    }

    f();
}
Run Code Online (Sandbox Code Playgroud)

请注意,当静态对象被销毁时,需要特别注意避免程序关闭时的错误。您必须确保没有静态对象的析构函数访问Arguments,否则您将面临未定义行为的风险。


use*_*042 1

如果您确实认为这是一个好主意,您可以轻松地将 cor 命令行参数设置为全局:

int argc_ = 0;
char** argv_ = NULL;

int main(int argc, char* argv[]) {
    argc_ = argc;
    argv_ = argv;

    // ...
}
Run Code Online (Sandbox Code Playgroud)