2016-05-03 31 views
-2

我正在嘗試編寫一個函數來接受命令行參數。在谷歌搜索我有這麼多的點擊,但都使用主函數的命令行參數,如下所示。在主函數以外的CPP中使用命令行參數

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

如果我已經有一個主要的功能,我想另寫功能,後來在主或任何其他程序調用,如何編寫,使用用戶定義的名稱即函數。

+2

如果你想要寫一個方法,但你甚至不知道如何傳遞參數...也許,你應該花了幾個小時的教育你自己關於你最喜歡的語言的絕對初學者基礎知識。這並不意味着侮辱,但在進行下一步之前,你應該對最重要的概念有所瞭解。 – GhostCat

+0

@Jägermeister感謝您的評論。 :) – AwaitedOne

+1

[main()]之外的[C++進程argc argv]的可能重複(http://stackoverflow.com/questions/12862798/c-process-argc-argv-outside-of-main) – gdlmx

回答

2

如果您希望參數可用,您可以將它們轉發給您的方法。例如:

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

int main(int argc, char** argv) { 
    my_method(argc, argv); 
} 
+0

如何使用他們在頭文件中。在'cpp'文件中'extern int argc'和'extern char ** argv'和定義'int argc',和'char ** argv',並在'main.cpp'中調用'int main(int argc,char * * argv)'。這樣對嗎。?? – AwaitedOne

1

您可以將它們傳遞給你打電話的功能,像這樣:

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(); 
} 
+0

如何在頭文件中使用它們。 'extern int argc'和'extern char ** argv'和定義'int argc',和'char ** argv'在cpp文件中,並在'main.cpp'中調用像'int main(int argc,char ** argv )'。這樣對嗎。?? – AwaitedOne

1

您可以將參數傳遞給函數:

#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); 
} 
0

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