์ค๋์ ์์นจ๋ถํฐ ์ผ์ด ์ ๋์ง ์๋๋ค
๋จธ๋ฆฌ๊ฐ ์ ์ ๋์๊ฐ์ ๋ง๋งํ ๋๋ ใ .,ใ
๊ทธ๋์~~ ๊ธฐ๋ถ ์ ํ ์ฉ์ผ๋ก ๊ธ ํ๋ ์๋ฐํ๊ฒ ์ฌ๋ฆฌ๊ณ ๋ค์ ์ด์ผ ํด๋ณด๊ฒ ๋ค
์ด์ ์ ์์ฑํ boost ๊ด๋ จ ๊ธ์๋ ์ผ๋ค์ํผ
๋๋ boost์ ๋ง์ ๊ณ ๋ง์์ ๋๋๋ค +_+ ์ฅ ์ด๊ฒ ์๋ค๊ณ ? ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง๊ธฐ ๋๋ฌธ
์ด๋ฒ์ ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์์ฑํ ๊ฒ ์์ด์ C๋ก ํ๋ ค๋ค๊ฐ C++๋ก ํ๋ ค๋๋ฐ
์ธ์์.. Boost์๋ program options๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด์
argument ๊ธฐ๋ฅ์ ์ฐธ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ฒ ํด ๋์๋ค
1. ๊ธด ์๋ก
์ฐ๋ฆฌ๊ฐ ์ด๋ค ํ๋ก๊ทธ๋จ์ ์คํํ ๋, ์ต์ ์ ์ถ๊ฐํ์ฌ ์คํ์ ํด๋ณธ ๊ฒฝํ์ด ์์ ๊ฒ์ด๋ค
argument๋ฅผ ํ๋ก์ธ์ค ์คํ ํ์ผ ๋ค์ ์ถ๊ฐํด์ ์ฌ์ฉํ๊ณค ํ๋๋ฐ
$ gcc --help
Usage: gcc [options] file...
Options:
-pass-exit-codes Exit with highest error code from a phase
--help Display this information
--target-help Display target specific command line options
--help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]
...
ํ๋ก๊ทธ๋จ๋ฟ๋ง ์๋๋ผ command์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ ๋๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค
Usage๋ฅผ ํ์ธํ๊ณ ์ถ์ ๋ --h ๋๋ --help ์๋ฐ ์์ผ๋ก
์ฌ์ฉํ ์ ์๋ ์ต์ ์ ๋ชฉ๋ก์ ํ์ธํ ์๋ ์๋ค
์ด ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณต์ ํด์ฃผ๋ ์ฐ๋ฆฌ์ Boost..
https://www.boost.org/doc/libs/1_79_0/doc/html/program_options/tutorial.html
์๊ฐ์ด ์กฐ๊ธ ์์ ๋ ํ๋ฒ ์ฝ์ด๋ณด๋ ๊ฒ์ ์ถ์ฒํ๋ค
๋ง์ฝ ์ด๊ฑธ ์ฌ์ฉํ๊ธฐ ์ซ๊ณ ๋ด๊ฐ ๊ตฌํํ๊ณ ์ถ๋ค?? ๋๋ C๋ก ๊ฐ๋ฐํ๊ณ ์ถ๋ค??
๊ทธ๋ ๋ค๋ฉด ์ ๋ง ๋ง์ ๋จ๊ณ์ if-else ๋ฌธ์ ์ฐ๋ฉฐ ํ์ฐ์ ๊ฑฐ๋ฆด ๊ฒ์ด๋ค...
๋๋ ๊ทธ๋ฌ๋ค
2. ์ฌ์ฉ๋ฒ
์ฐ์ Header file ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋์ ๊ฐ์ด ์ฌ์ฉํด์ผ ํ๋ค
#include <boost/program_options.hpp>
using namespace boost::program_options;
boost_program_options
๋ฐ๋ก ์์ ๋ถํฐ ๋ณด๊ณ ~~ ํ๋ํ๋ ์ ๋ฆฌํด๋ณด๊ฒ ๋ค
(1) options_description
string name;
int age = 0;
options_description desc{"Options"};
desc.add_options()
("help,h", "Help screen")
("name", value<string>(&name)->default_value("bell2"), "User Name")
("age", value<int>(&age)->notifier(on_age), "User Age");
options_description class๋ฅผ ์ฌ์ฉํ๋ฉด usage์ ์ค๋ช ์ ๋ถ์ผ ์ ์๋ค
๋ํ add_options()๋ผ๋ ํจ์์ operator()๋ฅผ ์ฌ์ฉํ์ฌ ํธํ๊ฒ ํญ๋ชฉ์ ์ถ๊ฐํ ์ ์๋ค
("name", value<string>()->default_value("bell2"), "User Name")
์๋ ๊ฒ ์ฐ๋ฉด "name"์ ์ถ๊ฐํ options์ key๊ฐ ๋๊ณ , ๋ ๋ฒ์งธ ์ธ์์๋ value๊ฐ ์ถ๊ฐ๋๋ค
์ด๋ ๊ฒ key, value ํํ๋ก ์ ์ฅ์ ํ๋ฉด ์ key๋ก ๊ฐ์ ๊ฐ์ ธ์ค๋ ๋ฑ์ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค
๋ ๋ฒ์งธ ์ธ์์
value<string>(&name)->default_value("bell2")
์๊ฒ์ --name์ ์ต์ ์ ๊ฐ์ string์ผ๋ก ๊ฐ์ ธ์ฌ ๊ฒ์ด๊ณ ,
๊ทธ ๊ฐ์ ธ์จ ๊ฐ์ name์ด๋ผ๋ ๋ณ์์ ์ ์ฅํ๋ค๋ ๋ป์ด๋ค
default_value๋ฅผ ์ค์ ํ ์๋ ์๊ณ , value<string>(&name)๋ง ์ฌ์ฉํ ์๋ ์๋ค
๊ทธ๋ฆฌ๊ณ ์ธ ๋ฒ์งธ ์ธ์๋ ํด๋น ์ต์ ์ ์ค๋ช ์ผ๋ก, --help ์ต์ ์ ์ ๋ ฅ ์์ ์ปค๋งจ๋ ์ฐฝ์ ๋ณด์ฌ์ค๋ค
๋ ๋ฒ์งธ ์ธ์๋ค์ ์ ๋ณด๋ฉด default_value ๋ง๊ณ ๋ notifier๋ผ๋ ๊ฒ์ด ์๋๋ฐ
value<int>(&age)->notifier(on_age)
์๋ on_age๋ผ๋ callback ํจ์๋ฅผ ๋ฑ๋กํด์, age ์ต์ ๊ฐ์ด ์์ผ๋ฉด on_age()๋ผ๋ ํจ์๊ฐ call์ด ๋๋ค
(2) variables_map
์๊ฐ ์ฐธ ์ฌ๋ฐ๋ ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐํ๋ค
variables_map vm;
store(parse_command_line(argc, argv, desc), vm);
notify(vm);
vaialbe_map์ด๋ผ๋ ๊ฑด ์ต์ ๋ค์ key, value ํํ๋ก map์ผ๋ก ์ ์ฅ์ ํด์ค๋ค
store()
์ต์ ๋ค์ ๋ํด ์ต์ข ๊ฐ์ผ๋ก ์ ์ฅ์ ํด์ค๋ค
์ฐ์ ์์๋ notify ์ฌ๋ถ ๋ฑ์ ํฌํจํด์~~
notify()
์๋ ์ต์ ์ ์ต์ข ๊ฐ์ด ๊ฒฐ์ ๋๋ฉด ํด๋น ์ต์ ์์ ์ํํด์ผ ํ๋ ๊ธฐ๋ฅ์ ์๋์ผ๋ก ์ํํด์
์บก์ํํ ์ ์๋๋ก ํด์ค๋ค
์๊น on_age ๊ฐ์ callback ํจ์๋ฅผ ๋ฑ๋กํ๋ฉด ์ด๋ฅผ ์คํํด์ค๋ค๋ ๋ป
(3) ๊ฒฐ๊ณผ ์ถ๋ ฅํ๊ธฐ
if (vm.count("help"))
std::cout << desc << '\n';
else if (vm.count("age"))
std::cout << "Age: " << vm["age"].as<int>() << '\n';
else if (vm.count("name"))
std::cout << "Name: " << vm["name"].as<string>() << '\n';
...
๊ทธ๋ผ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ป๊ฒ ์ถ๋ ฅํ๋๋
๊ฐ ์ ์ฅ์ ์ํด์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ value<T>(&name) ์ด๋ ๊ฒ ํด์ผ ํ๊ณ
๋ง์ฝ ์ ์ฅ์ ์ ํ๊ณ ๊ฐ๋ณ๊ฒ ์ถ๋ ฅ๋ง ํ๊ณ ์ถ๋ค๋ฉด
vm["age"].as<int>() ์ด๋ ๊ฒ ํด์ฃผ๋ฉด ๋๋ค
์ ์ฒด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค
#include <boost/program_options.hpp>
#include <iostream>
#include <string>
using namespace boost::program_options;
using namespace std;
void on_age(int age)
{
std::cout << "On age: " << age << '\n';
}
int main(int argc, const char *argv[])
{
try
{
options_description desc{"Options"};
desc.add_options()
("help,h", "Help screen")
("name", value<string>()->default_value("bell2"), "User Name")
("age", value<int>()->notifier(on_age), "User Age");
variables_map vm;
store(parse_command_line(argc, argv, desc), vm);
notify(vm);
if (vm.count("help"))
std::cout << desc << '\n';
else if (vm.count("age"))
std::cout << "Age: " << vm["age"].as<int>() << '\n';
else if (vm.count("name"))
std::cout << "Name: " << vm["name"].as<string>() << '\n';
}
catch (const error &ex)
{
std::cerr << ex.what() << '\n';
}
return 0;
}
๊ทธ๋ผ ์ด๋ง
์ฐธ๊ณ ์๋ฃ
https://www.boost.org/doc/libs/1_79_0/doc/html/program_options/overview.html#id-1.3.32.5.7.9
'๐ C๋ C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Boost๋ก ์๊ฐ ๊ฐ ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.11.29 |
---|---|
์ ์ฒ๋ฆฌ๊ธฐ(preprocessor)์ ๋งคํฌ๋ก(macro) (0) | 2022.02.07 |
Error ํด๊ฒฐ: boost::shared_ptr<boost::asio::io_context>::operator* (0) | 2022.02.04 |
STRUCT์ UNION์ ์์๋ณด์ (0) | 2021.07.12 |
C++ ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์์๋ณด์ - (2) shared_ptr (0) | 2021.06.25 |