【问题标题】:Using command line arguments in CPP other than main function在 CPP 中使用除 main 函数之外的命令行参数
【发布时间】:2016-08-28 09:14:03
【问题描述】:

我正在尝试编写一个函数来接受命令行参数。在 Google 搜索中,我得到了很多点击,但都使用带有 main 函数的命令行参数,如下所示。

#include <iostream>

int main(int argc, char** argv) {
    std::cout << "Have " << argc << " arguments:" << std::endl;
    for (int i = 0; i < argc; ++i) {
        std::cout << argv[i] << std::endl;
    }
}

如果我已经有一个 main 函数并且我想编写另一个函数,以后可以在 main 或任何其他程序中调用,如何编写它,即具有用户定义名称的函数。

【问题讨论】:

  • 如果你想写一个方法,但你甚至不明白如何传递参数......也许,你应该多花几个小时自学你最喜欢的语言的绝对初学者基础知识.这并不是侮辱,但在进行下一步之前,您确实应该对最重要的概念有所了解。

标签: c++ function


【解决方案1】:

Boost 提供实用程序来有效地处理参数..

因此,正如其他答案所指出的那样,您可以将此答案中提供的整个函数体移动到您的新函数中,并将 main() 中的“argc”和“argv”传递给您的新函数。

int
main(int argc, char *argv[])
{
   namespace po = boost::program_options;

   po::options_description desc("Usage: describe usage here [OPTIONS]");

   desc.add_options()
      ("help", "Print usage")
      ("list,l", po::value<std::string>(), "dummy command taking a value")
      ;

   po::variables_map vm;

   try
   {
      po::store(po::parse_command_line(argc, argv, desc), vm);

      if (vm.count("help"))
      {
         std::cout << desc << std::endl;
         return 0;
      }

      if (vm.count("list"))
      {
         std::cout << "Dummy command entered" << std::endl;
         return 0;
      }

      po::notify(vm);
   }
   catch (po::error& e)
   {
      std::cerr << "Error: " << e.what() << std::endl;
      std::cerr << desc << std::endl;
      return 1;
   }

}

编译&示例OP:

g++ -std=c++11 -Iboost_root/boost -Lboost_root/boost/stage/lib/ Options.cpp -l boost_program_options


./a.out --list dummy_value
Dummy command entered

【讨论】:

    【解决方案2】:

    您可以将参数传递给函数:

    #include <iostream>
    
    int my_function(int argc, char** argv) {
        std::cout << "Have " << argc << " arguments:" << std::endl;
        for (int i = 0; i < argc; ++i) {
            std::cout << argv[i] << std::endl;
        }
    }
    
    int main(int argc, char** argv) {
        my_function(argc, argv);
    }
    

    【讨论】:

      【解决方案3】:

      您可以将它们传递给您调用的函数,如下所示:

      void printArguments(int argc, char** argv) {
          std::cout << "Have " << argc << " arguments:" << std::endl;
          for (int i = 0; i < argc; ++i) {
              std::cout << argv[i] << std::endl;
          }
      }
      
      int main(int argc, char** argv) {
          printArguments(argc, argv);
      }
      

      ...或将它们存储在全局变量中,如下所示:

      int mainArgc;
      char** mainArgv;
      
      void printArguments() {
          std::cout << "Have " << mainArgc << " arguments:" << std::endl;
          for (int i = 0; i < mainArgc; ++i) {
              std::cout << mainArgv[i] << std::endl;
          }
      }
      
      int main(int argc, char** argv) {
          mainArgc = argc;
          mainArgv = argv;
          printArguments();
      }
      

      【讨论】:

      • 如何在头文件中使用它们。 extern int argcextern char **argv 和定义 int argcchar **argv 在 cpp 文件中并调用 main.cpp 就像 int main(int argc, char** argv) 。对吗??
      【解决方案4】:

      如果您希望参数可用,您可以将它们转发给您的方法。例如:

      void my_method(int argc, char** argv) {
         cout << "Num args: " << argc << endl;
      }
      
      int main(int argc, char** argv) {
          my_method(argc, argv);
      }
      

      【讨论】:

      • 如何在头文件中使用它们。 extern int argcextern char **argv 和定义 int argcchar **argvcpp 文件中并在 main.cpp 中调用 int main(int argc, char** argv) 。对吗??
      猜你喜欢
      • 2023-03-11
      • 2010-10-19
      • 2011-11-21
      • 2013-12-26
      • 2014-06-06
      • 2019-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多