#pragma init和#pragma fini在linux上使用gcc编译器

时间:2010-03-17 04:10:50

标签: c gcc pragma

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

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

3 个答案:

答案 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
}