【问题标题】:how to use c++ command line argument in different functions?如何在不同的函数中使用 C++ 命令行参数?
【发布时间】:2014-11-06 18:11:10
【问题描述】:

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

问:我如何在其他几个函数(不是主函数)中使用这两个参数,所以它们的作用类似于“全局”变量。

这里是一个例子,范围 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;
}

【问题讨论】:

  • 使用全局变量
  • 应该有更优雅的方式,我不想以常规方式使用全局变量。
  • 您要么使用某种形式的全局变量,要么将它们作为函数参数传递。
  • 你应该解释你的目的。有十几种方法可以满足您的要求,包括全局变量、单例、将函数包装为具有内部状态的类的方法、简单地将它们作为参数传递,使用 currying... 事实上,这个问题也是如此广泛地给出有意义的答案。
  • @Daniel std::bind 是在 c++11 中引入的。这开始看起来像X Y Problem。 OP 可能希望将尽可能多的数字传递给程序并让这两个函数使用这些数字

标签: c++ command-line-arguments


【解决方案1】:

使用全局变量:

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;
}

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      像这样:

      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;
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          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 可以为您省去很多麻烦。

          【讨论】:

            【解决方案6】:

            也许你想要这样的东西:

            #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+ 应该可以编译了

            【讨论】:

              猜你喜欢
              • 2013-01-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-08-30
              • 1970-01-01
              • 2015-06-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多