#pragma init和#pragma fini在linux上使用gcc编译器
我想构建一些代码,在共享库的加载时调用一些代码。 我以为我会这样做:
#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语句?
pragma几乎都是特定于编译器的。 GCC没有实现init
,但是使用constructor
函数属性可以获得相同的效果:
static __attribute__((constructor)) void my_init() { //do-something }
还有一个相应的destructor
属性。
显然, #pragma init
和#pragma fini
仅受GCC for Solaris支持:
相反,使用C ++:
// init.cpp namespace //匿名命名空间 { class autoinit { 上市: ~autoinit(){/ *破坏代码,如果适用* /} 私人的: autoinit(){/ * myinit的内容* /} static autoinit _instance; }; autoinit autoinit :: _实例; //静态实例强制静态构造 }