我想构建一些代码,在共享库的加载时调用一些代码。我以为我会这样做:
#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。我在实际代码中尝试了这个并且我的代码中止了,因为在pragma部分中没有调用函数,因为它被忽略了。
如何让gcc使用这些#pragma init和fini语句?
答案 0 :(得分:16)
pragma几乎都是特定于编译器的。 GCC没有实现init
,但您可以使用constructor
函数属性获得相同的效果:
static __attribute__((constructor)) void my_init()
{
//do-something
}
还有一个相应的destructor
属性。
答案 1 :(得分:3)
显然只有GCC for Solaris支持#pragma init
和#pragma fini
:
答案 2 :(得分:-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 }