#pragma init и #pragma fini с использованием компилятора gcc в linux - PullRequest
11 голосов
/ 17 марта 2010

Я хотел бы создать некоторый код, который вызывает некоторый код при загрузке разделяемой библиотеки. Я думал, что сделаю это так:

#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

Так что игнорируй мои #pragmas. Я попробовал это в реальном коде, и мой код был прерван, потому что функция не была вызвана в разделе прагмы, потому что она игнорировалась.

Как мне заставить gcc использовать эти операторы #pragma init и fini?

Ответы [ 3 ]

17 голосов
/ 17 марта 2010

прагмы почти все зависят от компилятора. GCC не реализует init, но вы можете получить тот же эффект, используя атрибут функции constructor:

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

Также имеется соответствующий атрибут destructor.

3 голосов
/ 17 марта 2010

Очевидно, #pragma init и #pragma fini поддерживаются только GCC для Solaris:

0 голосов
/ 17 марта 2010

Вместо этого используйте 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
}
...