__attribute__((visibility("default")))

반응형

__attribute__((visibility(""))) 매크로를 활용하면 라이브러리 내에 구현된 함수를 라이브러리 외부에서 호출할 수 있을지 여부를 결정할 수 있다.

 

라이브러리 내 함수를 구현할 때,

아래와 같이 __attribute__((visibility("default"))) 속성을 부여하면 해당 함수가 라이브러리 외부에 노출되어, 해당 함수를 라이브러리 외부에서 호출할 수 있다. 즉, 라이브러리를 링크하는 어플리케이션에서 해당 함수를 호출할 수 있다.

void __attribute__((visibility("default"))) do_something()
{
  ...
}

 

반대로,

아래와 같이 __attribute__((visibility("hidden"))) 속성을 부여하면 해당 함수가 라이브러리 외부에 노출되지 않아, 해당 함수를 라이브러리 외부에서 호출할 수 없다.  즉, 라이브러리를 링크하는 어플리케이션에서 해당 함수를 호출할 수 없다.

void __attribute__((visibility("hidden"))) do_something()
{
  ...
}

 

개인의 취향에 따라 다음과 같은 방식으로 코드 가독성을 높여볼 수도 있다.

#define OPEN_API __attribute__((visibility("default")))
#define INTERNAL __attribute__((visibility("hidden")))

// 라이브러리 외부에서도 호출 가능한 함수
void OPEN_API do_something_external()
{
  ...
}

// 라이브러리 내부에서만 호출 가능한 함수
void INTERNAL do_something_internal()
{
  ...
}

 

참고로 __attribute__((visibility(""))) 매크로는 GNU C 컴파일러로 컴파일하는 경우에 의미가 있다.

 

댓글

Designed by JB FACTORY