如何在不同的函数中使用c ++命令行参数?

时间:2014-11-06 18:11:10

标签: c++ command-line-arguments

我可以通过命令行参数定期读取参数(例如a和b)作为c ++代码的输入。

问:我如何在其他几个函数(不是主函数)中使用这两个参数,因此它们的行为类似于" global"变量。

这是一个例子,范围a和b只是主要而不是func1和func2。如何为func1和func2制作a和b?谢谢你的帮助!

int main (int argc , char* argv[]) 
{ 
double a=atof(argv[1]);
double b=atof(argv[2]);

return 0;
}

double func1(double x)
{
return x+a+b;
}

double func2(double x)
{
return x*x+a*b;
}

6 个答案:

答案 0 :(得分:3)

使用全局变量:

double a;
double b;

int main (int argc , char* argv[]) 
{ 
    a=atof(argv[1]);
    b=atof(argv[2]);

    return 0;
}

double func1(double x)
{
    return x+a+b;
}

double func2(double x)
{
    return x*x+a*b;
}

或功能参数:

int main (int argc , char* argv[]) 
{ 
    double a=atof(argv[1]);
    double b=atof(argv[2]);

    double x = 13.1;
    double someVal = func1(x, a, b);
    double someOtherVal = func2(x, a, b);

    return 0;
}

double func1(double x, double a, double b)
{
    return x+a+b;
}

double func2(double x, double a, double b)
{
    return x*x+a*b;
}

如果您希望数据在函数外部持久存在,则它需要是全局变量,或者您需要使用函数参数和返回值来维护数据范围。更不用说其他形式的面向对象设计,正如其他人提到的那样可以完成你正在做的任何事情......这就像你能得到的一样优雅。

答案 1 :(得分:0)

您可以将它们复制到实际的全局变量中。

答案 2 :(得分:0)

像这样:

double a, b;

int main()
{
    a=atof(argv[1]);
    b=atof(argv[2]);

    return 0;
}

double func1(double x)
{
    return x+a+b;
}

double func2(double x)
{
    return x*x+a*b;
}

答案 3 :(得分:0)

任何数据提供给程序其他部分的方法相同:将它们分配给全局变量或将它们作为函数参数传递。

答案 4 :(得分:0)

我喜欢在一个对象中存储参数以保持整洁,避免传递大量松散的参数。

class Arguments
{
public:
    Arguments(double a, double b) : A(a), B(b)
    {
    }

    double A;
    double B;
};

double func1(const Arguments& args, double x)
{
    return x + args.A + args.B;
}

int main(int argc, char* argv[])
{
    const Arguments args(atof(argv[1]), atof(argv[2]));

    const double x = 22;
    const double result = func1(args, x);

    return 0;
}

如果你需要传递许多命名参数,例如program --align 2 --method shortest --color orangeboost::program_options可以为你节省一些麻烦。

答案 5 :(得分:0)

也许你想要这样的东西:

#include <numeric>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <iostream>

int main (int argc , char* argv[]) 
{ 
    std::vector<double> values;
    std::transform(&argv[1], &argv[argc], std::back_inserter(values), atof);
    std::cout << func1(3.4, values) << std::endl;

    return 0;
}

double func1(double x, const std::vector<double>& values)
{
    return std::accumulate(values.begin(), values.end(), x);
}

double func2(double x, const std::vector<double>& values)
{
    // Do something similar here
}

请注意,您需要使用兼容c ++ 11的编译器才能使用此代码。 GCC 4.7+应该能够编译它