11

我想构建一些代码,在加载共享库时调用一些代码。我以为我会这样做:

#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 语句?

4

3 回答 3

17

编译指示几乎都是特定于编译器的。GCC 没有实现init,但你可以使用constructorfunction 属性获得相同的效果:

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

还有对应的destructor属性。

于 2010-03-17T04:21:23.807 回答
3

显然#pragma init并且#pragma fini仅受 GCC for Solaris 支持:

于 2010-03-17T04:27:32.730 回答
-3

相反,使用 C++:

// 初始化.cpp
namespace // 匿名命名空间
{
     类自动初始化
     {
         上市:
             ~autoinit(){ /* 销毁代码,如果适用 */ }
         私人的:
             autoinit(){ /* myinit 的内容 */ }
             静态自动初始化_instance;
     };

     自动初始化
     自动初始化::_instance; // 静态实例强制静态构造
}
于 2010-03-17T04:36:08.257 回答