'Program Lang./C++'에 해당되는 글 36건

  1. 2017.05.11 boost asio 정리 - 2 (io_service single thread 처리)
  2. 2017.05.11 boost asio 정리 - 1 기본동작
  3. 2017.04.26 [Basic] 클래스 상속 및 가상함수, 순수가상함수 정리
  4. 2017.04.26 [Basic] 맴버변수의 상수, 정적 속성, 상수와 정적변수 동시적용 시, 상수 맴버 함수 정리
  5. 2017.04.26 [Basic] 생성자 호출 정리
  6. 2017.04.11 boost asio를 이용한 iptuner 제작
  7. 2017.04.06 message queue implementation by c++ STL
  8. 2017.01.12 enable_shared_from_this 정리
  9. 2017.01.09 [json-c] simple generator json ojbect
  10. 2017.01.09 [json-c] simple parsing example

boost asio 정리 - 2 (io_service single thread 처리)

Program Lang./C++ 2017. 5. 11. 14:46

1. 목적

boost asio 정리 -1 첫번째 한계인 io_service start 시점부터 main() 함수가 block되는 한계를 개선하기 위한 코드


2. 코드 설명

정리-1과의 차이점은 boost::scoped_ptr<boost::thread> pThread; 추가이다. io_service에 대한 처리를 별도의 thread를 통해서 처리함으로써 main() 함수의 block을 막았다. 따라서 io_service의 printerHandler가 동작 중에도 main()함수에서 Key입력이나 다른 동작에 대해서 interactive하게 user에게 반응할 수 있다.


지금도 한가지 명확하지는 않지만 operation 맴버변수는 강제로 printerHander를 종료하기 위해서 넣었다. 결론적으로 io_service가 start되면 post()함수에 설정된 handler가 완전히 종료되어야지만 io_service 종료됨을 알 수 있다.




3. 실행결과

아래 실행 결과는 printerHandler loop 동작 중에 Enter 키를 누르면 반응하는 것을 알 수 있다. 



4. 정리

io_service start를 별도의 하나의 thread에서 실행하도록 하여, main()함수의 thread는 block되지 않도록 하였다. 이 코드에서 살펴봐야 할 부분이 io_service start를 위해서 하나의 thread만 생성하였다. 즉, single thread 구현이다. 차 후에 논의하겠지만 single thread로 돌리기 때문에 post()함수를 추가로 호출하여 handler를 추가하더라도 post에 정의된 handler 함수간에는 sync가 맞는다. 흔히 말하는 공유자원에 대한 lock이 필요 없다는 것이다. main() 함수에서 post함수를 하나 더 추가해서 호출하더라도 모든 처리는 io_service start된 single thread에서 처리된다는 것이다. 다음절에서 multi-thread 예제를 봐보독 한다.


:

boost asio 정리 - 1 기본동작

Program Lang./C++ 2017. 5. 11. 12:00

1. 목적

boost asio를 이용해서 IPTuner를 구현하는 과정에서 삽질한 내용을 정리한다. 국내 블로그들에는 정리가 잘 되어 있지 않는 것 같다. 따라서 stackoverflow등 여러 곳에서 참고한 내용을 기반으로 여기에 정리한다.


2. 코드 설명

정리-1부터 하나씩 기능을 추가해 가면서 고찰해 보도록 한다. 일단 아래 코드는 가장 간단한 예제이다. CTest라는 객체를 하나 생성하고 io_service를 start 시키는 코드이다.


여기서 자세히 봐야 할 부분은 io_service가 호출되면 아래 예제는 아래와 같은 특징을 갖는다.

  • main() 함수에서 키보드 입력해도 io_service의 handler함수인 printerHandler함수가 완료되기 전까지 block된다.

     즉, loop가 10번까지 돌 때까지 main()함수의 동작은 io_service가 call되는 시점부터 block된다.

  • loop가 10번 돌고나면 std::cin.get()함수에서 멈쳐있다.

여기서 좀 더 고찰해봐야 할 부분이 io_service start 호출 후에 main()함수 부분이 block되지 않고 User로부터 계속 응답을 하는 것이 필요하다. 또한 io_service는 일반적으로 asynchronization 동작에서 사용하는 것으로 이 예제로 모든 것을 커버하기에는 어렵다. 주제별로 하나씩 고찰해 본다. 



3. 실행결과

printerHandler가 동작 중일 때, Enter키를 강제로 두번 때려봤다. 예상되로 main()함수는 끝나지 않는다. 그리고 shell prompt는 두 번 Enter키를 입력한 결과로 printerHandler가 완료된 후에 결과를 출력하는 것을 볼 수 있다.



4. 정리

io_service start/poll이 호출되면 post에 정의된 callback함수가 완료될 때까지 io_service를 호출한 thread에서 block되는 것이 기본동작이다. start와 poll의 차이에 대해서는 최홍배님이 저술한 책 9장에 관련 내용이 정리되어 있다. 참고하시면 될 듯하다.

:

[Basic] 클래스 상속 및 가상함수, 순수가상함수 정리

Program Lang./C++ 2017. 4. 26. 16:13

1. 목적

클래스 상속의 기본 동작, virtual을 써야하는 이유, 순수 가상함수는 무엇인지 정리


2. 클래스 상속 기본

상속은 부모클래스의 생성자, 소멸자, 대입연산자, 정적속성, friend 속성을 제외한 모든 맴버변수 및 함수는 자식 클래스로 복사된다. 만약 부모와 동일이름의 맴버변수가 있으면 자식 클래스의 맴버변수가 우선순위를 가지고 부모 맴버변수는 자식 맴버변수에 가려진다. 동일 이름의 맴버변수는 자식 클래스의 맴버함수로 Overriding된다. 따라서 동일 이름이 존재하면 자식 것은 없애고 부모 것을 사용하던지, 추가 기능이나 변경이 필요하면 자식 클래스에 동일이름에 대해서 다시 구현하면 자동적으로 Overriding이 된다. 아래 예제의 color와 draw()가 이에 해당되는 변수와 함수이다.


강제타입 변환을 제외하고 부모 클래스는 자식을 가르킬 수 있으나, 그 역은 금지되어 있다. 주석처리된 부분이 풀리면 이와 같은 사유로 빌드 에러가 발생한다.



In CLine : draw
In CGraphic : draw
In CGraphic : draw


3. virtual 정의

객체를 동적할당하여 포인터 변수로 받을 때에 포인터 변수가 가르키는 객체를 어떤 기준으로 가져 올 것인가가 virtual의 사용의 출발점이다. 위의 예제에서 draw()함수는 virtual이 아니다. 따라서 CGraphic *pGraphic의 현재 포인터 변수 타입을 기준으로 객체를 가져온다. 따라서 자식 객체를 받더라도 실제 draw()의 실행은 부모 객체의 것이 실행된다. 이를 뒷 단의 할당되는 객체의 타입에 해당하는 draw()을 가져오고 싶으면 virtual로 draw()함수를 선언해야 한다. 아래 코드는 virtual로 변경한 예제와 실행 결과이다.



In CLine : draw

4. 순수 가상함수

상속 받은 자식 클래스에서 완벽하게 구현을 해야 하는 함수에 해당하는 것으로 순수 가상함수 존재하는 클래스는 객체를 생성할 수 없다. 단지 객체를 가르킬 수 있는 포인터 변수는 선언할 수 있다.



5. 정리

부모클래스의 모든 맴버변수 및 함수는 자식 클래스로 복사되고 동일 이름이 존재하면 맴버함수는 Overriding된다. 즉 그대로 사용하거나 재정의해서 사용하면 된다. virtual은 실제 포인터 변수에 할당되는 변수의 타입에 해당되는 객체의 타입을 가르키고자 할 때 사용한다. SoEn에 정리된 내용을 빌리자면 자식클래스에서 변경하거나 포인터 변수로 사용될 가능성이 있는 맴버함수는 virtual로 선언한다. 순수가상함수는 모든 구현을 자식클래스에 양도하는 것으로 부모클래스에는 Interface만 제공한다. 이를 추상클래스라고 한다. 


:

[Basic] 맴버변수의 상수, 정적 속성, 상수와 정적변수 동시적용 시, 상수 맴버 함수 정리

Program Lang./C++ 2017. 4. 26. 14:16

1. 목적

맴버변수나 맴버함수를 상수로 선언했을 때, 상수와 정적변수를 동시에 선언했을 때 동작이 나의 경우에는 잘 정리가 안되어서 여기에 정리한다. 


2. 맴버변수

1) 맴버변수가 상수속성만 가질 경우

- 각 객체는 생성자 호출 통해서 맴버변수를 초기화하고 다른 맴버 함수를 통해서 상수 속성을 가지는 맴버변수의 값을 바꿀 수 없다. 아래 첫번째 예제는 각 객체는 서로 다른 초기값으로 객체를 생성하엿다. 하지만 상수 맴버변수에 값을 설정하는 setDebugLevel() 함수의 구현부분은 주석처리 되어야지만 빌드 에러가 발생하지 않는다.



2) 맴버변수가 정적 속성만 가질 경우

- 각 객체는 해당 정적 변수에 대해서 모두 동일한 초기값을 가지며, 해당 정적 변수는 객체 생성전에 반드시 초기화되어야 한다. 따라서 생성자에 정적변수에 값을 설정하는 부분이 있는 1)번 예제는 모두 빌드 에러가 발생한다.

초기화 후에 다른 맴버 함수를 통해서 초기값은 변경가능하다. 1)번 예제와 차이점은 주석처리된 코드를 참조



3) 맴버변수가 상수와 정적 속성을 모두 가질 경우

- 각 객체는 동일한 초기값을 가지면서 이제 더이상 다른 맴버함수를 통해서 초기값을 변경할 수 없다. 아래 예제는 위의 예제 2)보다 더 많은 코드 부분을 주석처리해야지만 빌드에 성공할 수 있다. 즉 초기값을 변경하는 코드와 초기값에도 const라는 지시어가 들어가야 한다. 주석 부분 참조



3. 맴버함수 (상수속성의 맴버함수)

값을 변경하지 않는 맴버함수는 상수 속성을 주는 것을 권장하고 있다. 실제 이 부분은 Modern C++ 책에 잘 가이드되어 있다. 맴버함수의 상수 속성은 맴버함수의 Overloading의 기준이 됨으로 항상 상수와 비상수 맴버함수의 쌍을 가지는 것이 좋다. 아래 예처럼 객체가 상수 속성을 가지고 생성되면 상수 속성을 가지지 않는 맴버함수는 호출될 수 없다. 아래 주석 처리 부분 참조



4. 결론

const 속성을 가지는 맴버변수는 생성자에서 초기값을 전달할 수 있고, 이 그외의 맴버함수를 통해서 값 변경은 불가하다. 정적변수는 클래스에 속하는 변수로 초기화는 객체 생성전에 한번만 가능하고 맴버함수를 통해서 기존에 설정된 초기값을 변경할 수 있다. const와 static이 동시에 사용되면 각각 속성에서 제한된 속성이 모두 적용되는 형태이다. 상수 맴버함수는 객체가 상수속성을 가지고 생성되는 경우를 대비해서 값을 변경하지 않는 맴버함수는 상수 속성을 주는 것이 바람직하다. 

:

[Basic] 생성자 호출 정리

Program Lang./C++ 2017. 4. 26. 13:35

1. 목적

너무 어려운 부분만 파다보면 기본에서 헛갈리기 시작한다. 그런 면에서 "http://soen.kr/" 사이트는 정리가 잘 되어 있어서 도움이 많이 된다. 가장 기본이지만 자주 혼돈스러운 생성자 호출 방법에 대해서 정리한다. SoEn 사이트 내용을 인용 할 수 있다는 점을 원작자에게 알립니다.


2. 소스코드

아래 코드는 default 생성자 및 일반 매개변수를 가지는 생성자를 정적 또는 동적으로 호출하는 여러가지 경우에 대해서 정리하였다.


SoEn 사이트를 보면 암시적인 방법과 명시적인 방법으로 분류되어 있던데, 확실히 알아두면 다른 책을 보기에 편하다.



아래 코드는 생성자 부분에 default 지시어와 explicit 지시어를 추가하였다. 상세한 의미는 생략하고 내가 이해한 바로는 default 지시어는 default 생성자를 컴파일러에게 생성하도록 명명하는 것이고, explicit 지시어는 변환 생성자에 의미가 더 큰 지시어로 컴파일러가 임의적으로 변환을 막기 위해서 사용하는 것으로 SoEn에 잘 정리되어 있다. (변환 생성자부분 참조)



3. 생성자가 아닌 맴버변수 자체 초기화

default 지시어가 설정된 생성자를 통해서 생성된 객체는 맴버변수 초기화가 제대로 되어 있지 않다. 따라서 이를 다른 방법으로 처리할 수 있는데 c++11 이후에 가능한 것으로 안다. 예전에 읽었던 Modern C++에 정리되거나 standard c++ 표준에서 본 것 같은데 어디서 봤는지는 기억이 잘 안다. 하지만 아래와 같은 방법을 통해서 초기화가 가능하다.



:

boost asio를 이용한 iptuner 제작

Program Lang./C++ 2017. 4. 11. 20:23

1. 목적

boost asio를 몇 번을 봤는데, 볼 때마다 기억이 잘 나지 않는다. boost asio 예제를 하나 만들면 기억에 도움이 되지 않을까 하는 마음으로 작성한다. 예제는 내 Job과 관련이 있는 부분인 IPTV의 한 부분인 간단한 IPTuner를 만들어 본다.

IPTuner는 일반적으로 Multicast Stream을 수신하는 부분으로 간단한 예제이지만 큰 틀은 변하지 않는다.


boost buffer 부분은 좀 더 공부를 해야 할 듯 하다.


2. 소스코드

windsend나 VLC를 이용해서 server는 대체한다. 다만 VLC는 TS Stream를 VLC 맞게 변경하는 부분이 있어서 정확한 값을 얻기는 힘들다. 일단 windsend를 기반으로 동작 테스트를 진행한다. 


전에 올렸던 소스가 CTRL-C를 누르지 않으면 종료되지 않은 문제가 있어서 수정해서 다시 올린다. 전에 CTRL-C를 누르지 않으면 종료하지 않는 이유는 io_service에서 run을 호출하는 thread에서 block되기 때문에 그 thread가 main함수가 돌고 있는 thread여서 동작하지 않았다. 따라서 실제 socket에서 receive 동작을 하는 io_service 동작은 별도의 thread로 분리한다.


소스상에서 한가지 동작 중에 문제가 있는 부분은 io_service work에 관한 것이다. 실제 work는 io_service가 stop을 호출하지 전까지 io_service에 계속 block되어져야 하는데 block되지 않고 종료되는 문제가 있다. 계속 삽질 중이지만 생각되로 동작하지 않는 문제가 있다. 여기까지 오는데 엄청난 삽질을 해 됐다. 몇 가지 문제 빼 놓고는 정상적으로 동작하는 것으로 보인다.



3. 실행 결과

몇가지 스트림을 테스트 해 봤는데 값은 정상적으로 얻어온다.



:

message queue implementation by c++ STL

Program Lang./C++ 2017. 4. 6. 19:37

1. 목적

내 기억으로는 c++ STL에는 IPC 기능을 제공하는 Container가 존재하지 않는 것 같다. 결국 POSIX 같은 리눅스/유닉스 기반 IPC를 혼합해서 써야 하는 것인지 의문이다. c++ 공부 차원에서 Thread간 통신을 위해서 Message Queue를 한번 구현해 봤다. 많은 것을 고민하였으나 부족한 점이 많아 보인다. 부족한 점은 잘 잊혀버리니까 정리차원에서 아래에 기술하도록 한다.



2. 테스트 코드

코드의 전체 구성은 다음과 같다. class CMessageQueue와 class CMessageQueuePool로 구성되어 있다. CMessageQueuePool은 각각의 이름으로 생성된 CMessageQueue를 관리하기 위한 목적 이외에는 다른 사용 목적은 없다. CMessageQueuePool은 SingleTon 형식으로 만들려고 했는데 정확히 맞는지 확신은 없다. 일단 상속은 생각하지 않았다. 내 기억으로는 Boost에서는 SingleTon을 상속 받아서 처리하면 매우 쉬운것으로 알고 있다. 사실 CMessageQueuePool은 별개 없고 실제 동작은 CMessageQueue에서 이루어진다.


그럼 CMessageQueue를 살펴보면 std::queue<T>와 std::mutex 맴버변수가 있고 전송과 수신 메세지 맴버함수로 이루어져 있다. std::queue<T>는 실제 주고 받을 메세지가 저장되는 Queue이다. template를 사용한 목적은 메세지의 형식이 목적에 따라 다르기 때문에 template로 처리하였다. std::mutex는 std::queue<T>를 전송과 수신 쓰레드에서 각각 접근하는 공유자원이다. 따라서 mutex로 동기를 맞추기 위해서 추가하였다.


한가지 아쉬운 점은 CMessageQueue는 CMessageQueuePool에서만 객체를 생성할 수 있도록 하고 쉽은데, 몇 가지 이유로 쉽지 않다. CMessageQueue를 CMessageQueuePool 내부에 집어 넣으면 getMessageQueue() 함수처럼 CMessageQueue를 리턴 받아야 하는 함수를 어떻게 처리할 지 의문이다. CMessageQueue를 리턴 받지 않고 모두 CMessageQueuePool 내부에서 처리하도록 하면은 매번 messageQueue 이름으로 CMessageQueue의 객체를 뒤져야 하는 성능상의 단점이 있다. 이 부분은 좀 더 고민을 해 봐야 겠다.



3. 테스트 코드 실행

실행을 시켜보면 의도한 되로 정상동작한다. MesasgeQueue 전송 시에는 강제로 MessageQueue Empty 환경을 만들기 위해서 delay를 500ms 주고 던졌다. 수신쪽에서는 MessageQueue가 비어있으면 pthread condition 변수에 의해서 Task를 대기 시킴으로써 불필요한 CPU 점유률과 사용을 제거하였다.


 Trace in [getInstance,198]  
 Trace in [CMessageQueue,86]  
 Debug in [createMessageQueue,227]  
 Debug in [isMessageQueueEmpty,166]  
[receiveMessage,143] Message Queue Empty Condition 
 Debug in [sendMessage,112]  
 Debug in [isMessageQueueEmpty,166]  
 Debug in [receiveMessage,153]  
[operator(),287] received data : 0
 
 Debug in [isMessageQueueEmpty,166]  
[receiveMessage,143] Message Queue Empty Condition 
 Debug in [sendMessage,112]  
 Debug in [isMessageQueueEmpty,166]  
 Debug in [receiveMessage,153]  
[operator(),287] received data : 1
 
 Debug in [isMessageQueueEmpty,166]  
[receiveMessage,143] Message Queue Empty Condition 
 Debug in [sendMessage,112]  
 Debug in [isMessageQueueEmpty,166]  
 Debug in [receiveMessage,153]  
[operator(),287] received data : 2
 
 Debug in [isMessageQueueEmpty,166]  
[receiveMessage,143] Message Queue Empty Condition 
 Debug in [sendMessage,112]  
 Debug in [isMessageQueueEmpty,166]  
 Debug in [receiveMessage,153]  
[operator(),287] received data : 3


'Program Lang. > C++' 카테고리의 다른 글

[Basic] 생성자 호출 정리  (0) 2017.04.26
boost asio를 이용한 iptuner 제작  (0) 2017.04.11
enable_shared_from_this 정리  (0) 2017.01.12
[json-c] simple generator json ojbect  (0) 2017.01.09
[json-c] simple parsing example  (0) 2017.01.09
:

enable_shared_from_this 정리

Program Lang./C++ 2017. 1. 12. 19:02

1. shared_ptr 사용 시 고려사항

말로 기술하기 보다는 아래 예제 코드를 보면서 이해를 하자. shared_ptr 사용 시 주의해야할 내용이며 이를 방지하기 위해서 c++에서는 어떤 기술들이 고려되었는지 고민해 본다.



위의 코드는 shared_ptr의 잘못된 사용 예이다. type이라는 클래스를 하나 동적선언하고 두 개의 shared_ptr ptr1, ptr2에 할당하였다. 이 코드를 실행하면 실행파일이 죽는다. 왜냐하면 ptr2를 실행하는 시점에 ptr1에 의해서 이미 type객체의 파괴자는 호출되어서 객체가 없는 상태인데 ptr2에서 다시 파괴자를 호출하는 구조이다.


[실행결과] http://melpon.org/wandbox/ 에서 실행한 결과이다.



2. shared_ptr 사용 시 다른 고려사항

아래 예제는 http://en.cppreference.com/w/cpp/memory/enable_shared_from_this 의 내용을 내가 이해하기 편하게 수정한 내용이다. 위의 예제는 서로 다른 shared_ptr에 동일한 객체의 포인터를 할당하면 안되는 것을 보여주는 예제이다. 아래 예제는 단순하게 생각했을 때 충분히 있을 수 있는 내용이다.

만약 생성된 현재 객체의 주소를 넘겨서 다른 shared_ptr에서 받아서 처리한다면 어떨까? 아래 예제는 형식은 다르지만 결과적으로 위의 1번 예제와 동일한 문제로 귀결된다.



[실행결과] http://melpon.org/wandbox/ 에서 실행한 결과이다. 결과는 예제 1번 동일하게 실행 파일이 죽는다. 실행 파일이 죽는 이유도 동일하다.



3. enable_shared_from_this 필요성

enable_shared_from_this를 써야 하는 이유는 이제 알 수 있다. cppreference의 내용을 읽어보면 내 수준에서는 마음에 와 닿지 않았다. 아래 예제만 놓고 본다면 현재 객체를 가르키는 share_ptr이외에 추가적으로 현재 객체의 소유권을 갖고자 하는 shared_ptr을 추가하고 할 경우, std::enable_shared_from_this 클래스로부터 상속을 받는다. 이 때 2번 예제처럼 shared_ptr<type>(this)로 넘기기 보다는 enable_shared_from_this의 맴버함수를 통해서 유사한 동작을 수행하지만 shared_ptr의 reference_count를 증가시켜서 넘기는 추가적인 작업을 내부적으로 수행하는 것으로 보인다.

enable_shared_from_this 사용을 통해서 2번 예제의 문제점을 적절하게 수정한 아래 예제를 참조한다. 



[실행결과] http://melpon.org/wandbox/ 에서 실행한 결과이다. 정상적으로 객체가 소멸하는 것을 볼 수 있다.



4. 추가 reference

boost asio http server example 코드에서 enable_shared_from_this의 사용을 찾아볼 수 있다. connection.cpp 파일을 참조하면 사용 보기가 나온다. 


http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/examples/cpp11_examples.html#boost_asio.examples.cpp11_examples.http_server

'Program Lang. > C++' 카테고리의 다른 글

boost asio를 이용한 iptuner 제작  (0) 2017.04.11
message queue implementation by c++ STL  (0) 2017.04.06
[json-c] simple generator json ojbect  (0) 2017.01.09
[json-c] simple parsing example  (0) 2017.01.09
std::function 정리  (0) 2017.01.02
:

[json-c] simple generator json ojbect

Program Lang./C++ 2017. 1. 9. 21:57

1. 개요 

이번에는 object를 만들어서 string 및 파일로 출력하는 예제를 만들어 본다.


2. 테스트 코드 

앞장에서 주어진 string을 object 객체로 parsing했다면 이 장에서는 각 객체를 하나의 객체로 만드는 과정이다.

앞장의 역이라고 보면 된다.



3. 실행 결과 

{"name":"heesoon.kim","student":false,"age":41,"height":172.19999999999999,"interestings":["c","c++","javascript","phython"],"author-details":{"name":"heesoon.kim","Number of Posts":10}}


4. Check Point 

마지막에 호출한 json_object_put()에 주의할 필요가 있다. json-c library는 객체 생성을 위해서 HEAP 영역에 메모리를 할당한다. 이 할당한 메모리를 관리하기 위해서 reference count를 내부적으로 가지고 있다. json object들의 생성함수를 호출하면 reference count는 '1'로 초기화하고 json_object_get()을 호출하면 reference count가 1 증가, json_object_put()함수를 호출하면 reference count를 1 감소하는 구조이다. 또한 json_object_put()함수는 reference count가 '0'이 되면 객체를 위해서 할당한 HEAP 영역 메모리를 모두 해재한다.


따라서 마지막에 json_object_put()함수를 모두 호출하여 객체 생성을 위해서 할당한 메모리를 모두 해제하도록 하였다. 앞 장에서 전문가가 json-c library를 잘못 사용하면 메모리 누수가 발생할 수 있다는 의미를 알 것 같다. json_object_put()과 json_object_get()함수의 짝이 맞지 않거나 json_ojbect_put()함수를 객체 생성 후에 호출하지 않으면 모두 메모리가 쌓여 있을 것으로 보입니다.

'Program Lang. > C++' 카테고리의 다른 글

message queue implementation by c++ STL  (0) 2017.04.06
enable_shared_from_this 정리  (0) 2017.01.12
[json-c] simple parsing example  (0) 2017.01.09
std::function 정리  (0) 2017.01.02
unique_ptr, shared_ptr 읽히기  (0) 2016.12.30
:

[json-c] simple parsing example

Program Lang./C++ 2017. 1. 9. 14:45

1. 개요 

c언어로 되어 있는 json library이다. 나는 관련 일을 하지 않고 단순히 이용만 하는 입장이라서 자세히는 모르지만 제 기억에 어떤 전문가께서 세미나 하는 것을 들었는데 json-c는 주의를 기울이지 않으면 memory leak에 취약하다고 들었던 것 기억이 있다. 일단 난 사용법 익히는데 집중한다. 


2. json-c를 위한 cmake 수정 사항 

할 때마다 매번 찾아봐야 해서 여기에 정리해 놓는다. 다른 방법이 있겠지만 나는 단순히 pkg-config로 cflags 값과 libs 위치확인하고 강제로 cmake에 막았다.



수정사항은 cflags (헤더파일 위치)를 위한 include_directories(/usr/local/include/json-c)

libs 관련 정보 : link_directories(/usr/local/lib), json-c (-l 플래그 관련 수정 사항)


3. json 기본 Type 테스트

json의 기본 타입은 아래와 같다.

  • null
  • boolean
  • double
  • int
  • object
  • array
  • string
타입에 대한 정의 및 각 타입을 읽어들이는 방법은 아래 코드에 자세하게 나와 있다.


char형의 string을 json_tokener_parse() 함수를 통해서 json object로 변경한다. object내에 있는 각 값을 타입에 따라 parsing하는 예제이다. 입력 string은 하나의 큰 object에 string, boolean, integer, float, array, object로 구성되어 있다. 앞의 name, student, age, height, interestings, author-details는 key를 의미하고 각각 key와 오른쪽은 value이다.

여기서 array와 object는 추가적인 parsing이 더 들어가야 한다.


4. 실행결과


'Program Lang. > C++' 카테고리의 다른 글

enable_shared_from_this 정리  (0) 2017.01.12
[json-c] simple generator json ojbect  (0) 2017.01.09
std::function 정리  (0) 2017.01.02
unique_ptr, shared_ptr 읽히기  (0) 2016.12.30
c++ pair 읽히기  (0) 2016.12.30
: