9월, 2015의 게시물 표시

C++ type demangling

C++에 타입을 실행시간에 얻어내는 것은 typeid라는 연산자가 해주긴 하는데, type_info::name() 메소드로 찍어보면 영... 사람이 볼만한 내용이 아니다. C++의 오버로딩(같은 메소드에 입력인자만 달리 하여 정의하는 것) 덕에 실제 바이너리에 기록할 때는 몇가지 규칙을 가지고 이름(symbol)을 변형하여 기록한다. 이것을 mangling이라고 한다.

이런 이름을 사람이 알아볼 수 있는 것으로 변환하는 표준은 없다. orz OTL

다만, GCC에서 만든 ABI(Application Binary Interface)를 통해 사람이 보기 편한 형태로 변환해주는 API를 제공한다.

std::string
demangle(const char* mangled)
{
  using result_type = std::unique_ptr<char[], void (*) (void*)>;
  int status(0);
  result_type result(abi::__cxa_demangle(mangled, nullptr, nullptr, &status), std::free);
  return status == 0 ? result.get() : "";
}

참조: https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html
참조: http://stackoverflow.com/questions/281818/unmangling-the-result-of-stdtype-infoname

C++11 auto string types

auto key1 = "Hello, world!"; // char* char key2[] = "Hello, world!"; // char array included null-terminate auto key3[] = "Hello, world!"; // ERROR! auto key4 = {"Hello, world!"}; // std::initialize_list<char const* const> auto key5 = {'H','e','l','l','o',',',' ','w','o','r','l','d','!'}; // std::initialize_list<char const> char key6[] = {'H','e','l','l','o',',',' ','w','o','r','l','d','!'}; // std::initialize_list<char const>

오랜만에 쓰면 헷갈리니까 기록하는 차원에서, C++11에서 스트링을 auto로 받았을 때 어떤 형태로 되는지 테스트 해봤다.

key1은 char[]를 예상했지만, char*로 받더라. sizeof(key1)하면 8(64bit)을 뱉는다.

key2는 당연히 char[]이지만, "Hello, world!\0"까지 계산해서, sizeof(key2)하면 14를 뱉는다.

key3는 아쉽게도 GCC 5.0에서 컴파일 에러를 뿜어낸다.

key4는 initialize_list<>객체를 받는데, 내부에 포인터가 2개인가보다.…

Ubuntu Bash에서 Powerline 적용하기

이미지
쉘에 예쁘장하게 보여주는 Powerline이라는 프로젝트가 있다.

<그림> Powerline Vim Screenshot
하악하악 아름다워! ... 하지만 설치는 쉽지 않다. 글꼴도 패치해야하고, 파이썬 모듈도 깔아야하고... RPM/DEB 패키지로 한 방에 설정까지 똑 떨어지지 않으면, 아무래도 차후 OS 업그래이드할 때, 귀찮아진다. 결국 OS 재설치로 이어지겠지만...

# Bash에 적용하기!! 먼저 Ubuntu 15.04에 패키지를 살펴보았다. 엇! powerline이 있잖아!! 낼름 apt-get으로 설치해보자.

$ sudo apt-get -y install powerline


헤헷... 쉽잖아!...면 블로깅 하지 않았겠지. orz OTL


적당히 계정 홈 디렉토리에 .bash_aliases 파일을 생성하고, 몇가지 명령을 때려 넣어주자. .bash_aliases 파일은 .bashrc를 통해 존재하면, 자동으로 실행하는 쉘 스크립트인데, Ubuntu에만 있으니까, Redhat계열은 적당히 .bashrc 등에 만들어주자.


$ vi ~/.bash_aliases

powerline-daemon -q
POWERLINE_BASH_CONTINUATION=1 
POWERLINE_BASH_SELECT=1
. /usr/share/powerline/bindings/bash/powerline.sh

거창하게 powerline-daemon도 띄우고, 스크립트도 실행해야한다. Redhat 계열은 맨 아래 스크립트 위치를 적당히 고쳐주자.

그리고 새 터미널 열면 끝~

# Vim에 적용하기! 많은 길을 걸어왔지만, 결국 vim-addon-manager에게 시키면 간단하다.


$ sudo apt-get -y install vim-addon-manager
$ sudo vim-addon-manager -w install powerline

다 하고 나서, 상태줄이 표시되지 않으면, ~/.vimrc에 아래 줄을 추가하자.

set laststatus=2 " Always display the …