2016-05-03 2 views
-2

Я пытаюсь написать функцию для принятия аргументов командной строки. В поиске Google у меня было так много хитов, но все они используют аргументы командной строки с главной функцией, что-то вроде ниже.Использование аргументов командной строки в 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

Возможный дубликат [C++ process argc argv вне main()] (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

Как использовать их в заголовочном файле. 'extern int argc' и' extern char ** argv' и определение 'int argc' и' char ** argv' в 'cpp' файле и вызывая в' 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 предоставляет утилиты для эффективного управления аргументами.

Итак, как указывали другие ответы, вы можете перенести все тело функции, представленное в этом ответе, на новую функцию и передать «argc» и «argv» из main() к вашей новой функции.

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 
Смежные вопросы