GNU C - 一个别致的 HelloWorld 程序 (__attribute__机制)

对[ __attribute__ ] 很感兴趣,下面来看一个不一样的HelloWorld程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
 
static   __attribute__((constructor))  void  before()
{
 
     printf ( "Hello" );
}
 
static   __attribute__((destructor))  void  after()
{
     printf ( " World!\n" );
}
 
int  main( int  args, char  ** argv)
{
 
     return  EXIT_SUCCESS;
}

 我们知道这是一个HelloWorld程序,所以输出的结果就是"Hello World!",很简单,不需要对这点过多关心.

下面我们来关心关心别的:

1
2
3
__attribute__((constructor))
 
__attribute__((destructor))

 解释一下:__attribute__((constructor)) 在main() 之前执行,__attribute__((destructor)) 在main()执行结束之后执行.

上面的例子中我没有在main函数中添加任何的输出,所以看不到具体的信息.这点可以自己尝试~

 

如果要在main()之前或者是执行完成之后,需要执行很多的前处理动作或者是后处理动作,我们应该怎么处理?

也许,你需要下面这些东西:

__attribute__((constructor(PRIORITY)))
__attribute__((destructor(PRIORITY)))

 PRIORITY: 优先级.

好吧,下面就来试试:

GNU C - 一个别致的 HelloWorld 程序 (__attribute__机制)_第1张图片

执行的输出如下:

GNU C - 一个别致的 HelloWorld 程序 (__attribute__机制)_第2张图片

 从输出的信息看,前处理都是按照优先级先后执行的,而后处理则是相反的,好吧,我们使用GDB调试验证一下:

 

GNU C - 一个别致的 HelloWorld 程序 (__attribute__机制)_第3张图片

 从调试的信息也是验证了上面的结果.

 

另外一个问题,优先级有没有范围的? 

其实刚开始我写的程序中的优先级是1,我们将上面的程序改一下,然后编译看一下会有什么样的结果:

 

 

 0-100(包括100),是内部保留的,所以在编码的时候需要注意.

 

关于__attribute__的用法,可以有另外一种写法,先声明函数,然后再定义.

 

GNU C - 一个别致的 HelloWorld 程序 (__attribute__机制)_第4张图片

 glibc多采用第一种写法.

 

你可能感兴趣的:(helloworld,attribute)