Я хотел бы создать некоторый код, который называет некоторый код loadup общей библиотеки. Я думал, что сделаю это как это:
#pragma init(my_init)
static void my_init () {
//do-something
}
int add (int a,int b) {
return a+b;
}
Таким образом, когда я создаю тот код с
gcc-fPIC-g-c - Стена 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 операторы?
Практически все прагмы зависят от компилятора. GCC не реализует init
, но вы можете получить тот же эффект, используя атрибут функции конструктор
:
static __attribute__((constructor)) void my_init()
{
//do-something
}
Также имеется соответствующий атрибут деструктор
.
Вместо этого используйте 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 }
Очевидно #pragma init
и #pragma fini
поддерживаются только GCC для Solaris: