2010-03-17 3 views
10

공유 라이브러리의 loadup에서 일부 코드를 호출하는 코드를 작성하고 싶습니다. 난 내가 이런 식으로 그것을 할 것이라고 생각 :리눅스에서 gcc 컴파일러를 사용하는 #pragma init 및 #pragma fini

#pragma init(my_init) 

static void my_init() { 
    //do-something 
} 

int add (int a,int b) { 
    return a+b; 
} 

을 그래서 내가

과 그 코드를 빌드 할 때의 gcc -fPIC -g -c -Wall tt.c

그것은

을 반환
gcc -fPIC -g -c -Wall tt.c 
tt.c:2: warning: ignoring #pragma init 
tt.c:4: warning: ‘my_init’ defined but not used 

그래서 #pragma를 무시합니다. 실제 코드에서이 코드를 시도했는데 코드가 무시 되었기 때문에 pragma 섹션에서 함수가 호출되지 않았기 때문에 코드가 중단되었습니다.

어떻게 이러한 #pragma init 및 fini 문을 gcc에 사용하게 할 수 있습니까?

답변

16

거의 모든 컴파일러는 고유합니다. GCC는 init 구현하지 않습니다,하지만 당신은 constructor 기능 속성을 사용하여 동일한 효과를 얻을 수 있습니다

static __attribute__((constructor)) void my_init() 
{ 
    //do-something 
} 

또한 해당 destructor 속성이있다.

+0

을 내가 찾던 정확히! – Josh

+0

Hm, gcc 4.4.6 위의 예에서 '{'token '오류 이전에'expected ','or ';'를 얻습니다. 함수 정의에서 속성을 제거하고 그 앞에 생성자 속성이있는 함수 선언을 넣으면 예상대로 작동합니다/[documented] (http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html). – maxschlepzig

+0

@maxschlepzig : 속성은 갱신 된 함수 정의에서 선언 자 앞에 있어야합니다. – caf

-2

을 대신 C를 사용 ++ :

 
// init.cpp 
namespace // an anonymous namespace 
{ 
    class autoinit 
    { 
     public: 
      ~autoinit(){ /* destruction code, if applicable */ } 
     private: 
      autoinit(){ /* content of myinit */ } 
      static autoinit _instance; 
    }; 

    autoinit 
    autoinit::_instance; // static instance forces static construction 
} 
+0

그는 정적 생성자가 호출되기 전에 그의 코드를 호출해야 할 수도 있습니다.이 경우 작동하지 않을 수 있습니다 (초기화 순서를 제어 할 수없고 보장 할 수 없음). 표준 C++에서는 실제로 수행하기가 거의 불가능합니다. –

+0

@Grant, __attribute __ ((constructor))로 선언 된 함수의 상대적인 순서를 제어 할 수 있습니까? 그렇지 않다면 어떻게 다른가요? 게다가이 메서드는 모든 C++ 구현에서 이식 가능하지만 __attribute __ ((생성자)) 구문은 GCC에서만 사용할 수 있습니다. –

+1

__attribute __ ((constructor)) 구문은 다른 모든 코드보다 먼저 호출된다는 구문을 보장합니다. 또한 그것은 당신이 그 생성자에 대한 우선 순위를 지정할 수 있도록 다중이 지정되면 어떤 명령을 내릴지를 안다. 이식성에 관해서는 정적 클래스 생성자 (초기화 제어)가 호출되기 전에 코드를 호출하는 것이 isn 표준 C++을 통해 가능하지는 않지만 이식성있는 방법은 없습니다. 당신은 이미 내가 무엇을 말하고 있는지를 지적했다. 당신의 방법은 코드가 정적 클래스보다 먼저 실행되는 것을 허용하지 않는다. –

관련 문제