2015-10-26 30 views
8

Yükseltme 1.58.0 ile komut satırını ayrıştırmaya çalışıyorum. Kodum oldukça basit ve öğreticilerden kopyala yapıştır. Bu böyle görünüyor:Yükseltme: konumsal bağımsız değişken için tanınmayan seçenek

try { 
     po::options_description desc; 
     desc.add_options() 
       ("version,v", "Display version of application."); 

     po::positional_options_description p; 
     p.add("input-file", -1); 

     try 
     { 
      po::store(po::command_line_parser(argc, argv). 
         options(desc).positional(p).run(), vm); 

      if (vm.count("version") ) 
      { 
       std::cout << "Program version: " << SHUF_T_VERSION << std::endl << "Boost library version: " << BOOST_LIB_VERSION << std::endl; 
       return false; 
      } 

      po::notify(vm); // throws on error, so do after help in case 
      // there are any problems 
     } 
     catch(po::error& e) 
     { 
      std::cerr << "ERROR: " << e.what() << std::endl << std::endl; 
      std::cerr << desc << std::endl; 
      return false; 
     } 

    } 
    catch(std::exception& e) 
    { 
     std::cerr << "Unhandled Exception: " 
        << e.what() << ", application will now exit" << std::endl; 
     return false; 

    } 

    return true; 

bütün kod here olduğunu. Kod doğru görünüyor. app -v, doğru bir şekilde işlendi. Ancak, app myfile gibi herhangi bir konumsal tartışmayı eklerseniz, po::store()unrecognised option 'myfile''u atar. Bunun neden yaşandığı hakkında bir fikrin var mı?

cevap

9

bir aksam olarak "girdi-dosyası" eklemeniz gerekir:

po::options_description desc; 
desc.add_options() 
     ("version,v", "Display version of application.") 
     ("input-file", po::value<std::vector<std::string> >(), "input file"); 

the tutorial Gönderen:

"girdi-dosyası" seçeneği işlemek için dosyaların listesini belirtir.

compiler a.cpp

Biz bir an bu ele alacağımız ile karşılaştırıldığında,

compiler --input-file=a.cpp

biraz standart dışı olduğunu: böyle bir şey yazma, tabii ki, bir başlangıç ​​için iyidir, ama.

Yukarıdaki gibi bir seçenek adı olmayan komut satırı simgeleri, bu kitaplık tarafından "konumsal seçenekler" olarak adlandırılır. Onlar da ele alınabilir. Kullanıcıdan biraz yardım alarak, kütüphane "a.cpp" nin gerçekten "--input-file = a.cpp" ile aynı anlama geldiğine karar verebilir. İşte ihtiyacımız olan ek kod:

po::positional_options_description p; 
p.add("input-file", -1); 

po::variables_map vm; 
po::store(po::command_line_parser(ac, av). 
      options(desc).positional(p).run(), vm); 
po::notify(vm); 
İlgili konular