2013-02-17 2 views
10

함수에서 C에서 static 키워드를 사용하면 정의 된 컴파일 단위로 함수가 제한된다는 것을 알고 있습니다. 이제 기호 가시성을 조사하고 있는데, 함수와 함수의 차이가 __attribute__((visibility("hidden")))으로 표시되거나 -fvisibility=hidden 명령 줄 옵션을 사용하여 다소 혼란 스럽습니다.정적 함수와 "hidden"가시성 속성이있는 함수의 실제 차이점은 무엇입니까?

이러한 것들을 바꾸는 방식이 전혀 다르지는 않지만 실제로 차이점이 무엇인지, 실제 코드에서 작업 할 때 의미하는 바를 알지 못한다고 생각합니다. 둘 사이에 어떤 변화가 생기며 언제 다른 것을 사용하고 싶습니까?

답변

12

__attribute__((visibility("hidden")))와 기능을 포함하는 공유 라이브러리 밖에 표시되지 않지만 그와 같은 라이브러리 함수는 fhidfoo.c에 정의 bar.c 호출 할 수 foo.pic.obar.pic.o와 연결하여 제조 한 경우. 물론 외부 코드 (예 : 메인 프로그램이나 다른 공유 라이브러리)는 호출 할 수 없습니다. fhid

숨겨진 가시성은 숨겨진 가시성을 구성하는 개별 편집 단위가 아닌 전체 공유 라이브러리에 적용됩니다. 이에

foo.cstatic void fsta(void) 함수를 정의하는 것이 가능했을 및 bar.c 위해 (즉 조악이고 가독성 이유로 피해야한다하더라도)를 다른static void fsta(void) 함수를 정의.

또한 원칙적으로 static 함수는 더 쉽게 인라인 될 수 있거나 컴파일러에서 다른 호출 규칙을 사용할 수 있습니다.

+0

+1 –

0

숨겨진 공개는 심볼 동적 기호 테이블에 배치되지 않으므로, 다른 "모듈" (실행 또는 공유 라이브러리)를 직접 참조 할 수없는 것을 나타낸다.

http://ohse.de/uwe/articles/gcc-attributes.html

내가 추가 할 수 있습니다 : 당신은 static의 C 버전에 가까운 의미로 C ​​++로 __attribute__((visibility("hidden")))를 사용할 수 있습니다. 당신이 공유 라이브러리에 global 기능이있는 경우

+0

정확하지 않음 : 두 개의 다른 컴파일 단위에서 동일한 이름의 두 개의 다른 정적 함수를 사용할 수 있습니다. 숨겨진 가시성을 가진'f'와 같은 함수 2 개를 가질 수 없습니다. –

4

당신은 공유 라이브러리의 컨텍스트 내에서 사용할 수 싶어 있지만 공유 라이브러리 외부 - 당신은 예를 들어 __attribute__((visiblity("hidden")))

필요

다음

와 같은 기능을 할 수 있습니다 당신은 void foo()Foo.c에 정의 된 기능을 가지고 있고 당신은 Bar.cFooBarBaz.dll (또는 FooBarBaz.so)를 생산하는 컴파일 단위 Baz.c에서 참조 할 싶다면

dll (또는을로드하는 실행 파일에 foo()이 표시되지 않습니다.so 파일) 읽어보기 paper

관련 문제