在main函数前后执行的函数之 C语言

在gcc中,可以使用attribute关键字,声明constructor和destructor,来指定了函数在main之前或之后运行,代码如下:

 1 #include <stdio.h>
 2 
 3 __attribute((constructor)) void before_main()
 4 {
 5     printf("%s/n",__FUNCTION__);
 6 }
 7 
 8 __attribute((destructor)) void after_main()
 9 {
10     printf("%s/n",__FUNCTION__);
11 }
12 
13 int main( int argc, char ** argv )
14 {
15     printf("%s/n",__FUNCTION__);
16     return 0;
17 }

当然也可以指派多个,而且在申明时 
void before() __attribute__((constructor));
void __attribute__((constructor)) before();
__attribute__((constructor)) void before();

这3种都是对的,__attribute__(())写法比较随意,当一般推荐放在后面,当然定义函数体的时候 __attribute__(()) 不能放在后面,推荐定义函数的时候一般不要使用,这就是为什么推荐第一种的原因,__attribute__属性列表的用法还有还多,内存对齐,函数格 式, 等等等等就不一一列举了。man gcc 查找下 __attribute__可以发现这些,另标准库和Linux内核里面也有不少。

也可以一次指定多个属性 如下:

1 void func(void) __attribute__((constructor destructor));  

 

在Windows的VC++中可以指定设定数据段来做,以实现同样功能,如下:

 1 #include <stdio.h>
 2  
 3 int main(int argc, char ** argv)
 4 {
 5     printf("%s\n", "main");
 6     return 0;
 7 }
 8  
 9 int before()
10 {
11     printf("%s\n", "before");
12     return 0;
13 }
14  
15 int after()
16 {
17     printf("%s\n", "after");
18     return 0;
19 }
20 
21 typedef int func();
22 
23 #pragma data_seg(".CRT$XIU")
24 static func *before_function_array[] = { before };
25 
26 #pragma data_seg(".CRT$XPU")
27 static func *after_function_array[] = { after };
28 
29 #pragma data_seg()

 

attribute还有个应用, 就是增加函数别名(下面那个就不能是main了,要不就重复定义了):

# include <stdio.h>
int main(int argc, char **argv) __attribute__((alias("LinuxMain")));int LinuxMain(int argc, char **argv)
{printf("%s\n", __func__);return 0;
}int main123(int argc, char **argv)
{printf("%s\n", __func__);return 0;
}

 

转载于:https://www.cnblogs.com/marvin-notes/p/4432179.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSTO开发,转帖

http://www.cnblogs.com/oneivan/p/4243574.html转载于:https://www.cnblogs.com/xianerwonder/p/4432595.html

PowerDesigner的汉化破解安装到逆向工程(ORACLE)

一、软件安装 1、下载软件并安装安装16.5汉化版下载地址&#xff1a;真正的汉化-PowerDesigner 16.5 汉化&#xff08;包含安装文件和汉化文件&#xff09; 破解包下载地址&#xff1a;PowerDesigner V16.5 安装文件 及 破解文件 &#xff08;包含安装文件和破解文件&#xff0…

JAVA开发随记

想到一点写一点&#xff0c;遇到一点补充一点。 1、成员变量 在定义成员变量时尽量不要直接赋值&#xff0c;最好是在初始化信息的时候进行赋值操作。如果需要在属性定义的时候进行赋值&#xff0c;那么请用final修饰该属性。错误实例 class A extends B {/** 到期日距离当前…

PHP反射ReflectionClass、ReflectionMethod 入门教程

PHP反射ReflectionClass、ReflectionMethod 入门教程 作者&#xff1a;SNSGOU 发布于&#xff1a;2014-03-16 16:44:00 分类&#xff1a;PHP 浏览(6145) PHP5 具有完整的反射API&#xff0c;添加对类、接口、函数、方法和扩展进行反向工程的能力。 反射是什么&#xff…

Oracle开发常用知识

一、利用游标实现循环嵌套 在对oracle数据进行操作时我们会经常碰到循环甚至循环嵌套的情况。这个时候游标的作用就体现出来了。 DECLAREvId NUMBER(19);vDate DATE;--a表游标定义CURSOR a_cursor ISSELECT DISTINCT o.employeeId FROM operations o WHERE o.employeeId IS N…

条件控制(if ) ( case)

一&#xff1a;IF应用格式 (1)                  (2)                (3) IF 条件 THEN           IF 条件 THEN            IF 条件1 THEN --代码块               --代码块          …

使用临时表解决union和order by不能同时使用的问题

最近遇见了这样一个问题&#xff0c;有4张表&#xff0c;A&#xff08;单据&#xff09;表&#xff0c;B&#xff08;产品&#xff09;表&#xff0c;C&#xff08;产品类型&#xff09;&#xff0c;D&#xff08;单据产品关联表&#xff09;。 B表有唯一对应的类型C&#xff…

2.3线性表的链式存储和运算—双向链表

以上讨论的单链表的结点中只有一个指向其后继结点的指针域next&#xff0c;因此若已知某结点的指针为p&#xff0c;其后继结点的指针则为p->next &#xff0c;而找其前驱则只能从该链表的头指针开始&#xff0c;顺着各结点的next 域进行&#xff0c;也就是说找后继的时间性能…

Oracle常用字符串操作

参考&#xff1a; 一、oracle操作字符串&#xff1a;拼接、替换、截取、查找&#xff1b; 二、oracle中的trim函数使用介绍 --字符串去空格 --输出:a b c; SELECT TRIM( a b c ) || ; FROM dual; SELECT TRIM(BOTH FROM a b c ) || ; FROM dual; --输出: a …

linux下面安装maven

maven作为最近比较火的项目管理工具&#xff0c;对项目的jar包及其开元添加相应的插件的管理&#xff0c;很方便。 安装maven&#xff1a; 在官网上面去下载最新的maven的压缩包&#xff0c;apache-maven-3.3.1-bin.tar.gz. 将下载的压缩包保存/usr/local/maven下&#xff0c;进…

Hibernate懒加载问题

刚开始接触这种数据持久化框架时&#xff0c;使用的是Maybatis&#xff0c;相较于最原始的JDBCSQL模式&#xff0c;Maybatis简直就是神器&#xff0c;特别是在用过Maybatis动态SQL后&#xff0c;简直就开始对Maybatis爱不释手。后来工作要求&#xff0c;又接触到了Hibernate&am…

实现点击按钮后,倒计时60秒才能再次点击

转载于:https://www.cnblogs.com/liu201312/p/4447710.html

通过栈(Stack)实现对树的遍历

说到数的遍历树&#xff0c;长期以来的第一印象都是通过递归去实现。然而今天看了某位前辈的代码&#xff0c;才发现使用栈去实现遍历是那么简单。理论上通过数组也是可以实现同等功能的&#xff0c;毕竟Stack也是通过数据去实现的。 package com.sysway.ui.widget;import jav…

设计模式_01_单一原则

设计模式_01_单一原则 package designPatternOf_01; /*** 单一原则示例&#xff1a;动物呼吸* 引入的问题&#xff1a;鱼不吸空气&#xff0c;吸水*/ public class SinglePrinciple_01 {public static void main(String[] args) {Animal animalnew Animal();animal.breath(&quo…

StroyBoard中UICollectionView中添加Header和footer

到Storyboard中&#xff0c;选择collection view controller中的"Collection View"。在Attributes inspector中&#xff0c;选择"Section Header"和"Section Footer",一旦选中你就会在屏幕中看到下面的的显示&#xff1a; 最重要的是&#xff0c…

树形结构数据汇总查询解决方案+优化求助

最近遇到一个地区数据汇总的问题&#xff0c;地区下的地址呈树形结构&#xff0c;&#xff08;简化结构&#xff09;如A市下有B、C区&#xff0c;B区下有D、E街道。先要查询所有地区的人数&#xff08;包括子区域&#xff09;&#xff0c;如A的人数直属A的人数B的人数C的人数D的…

find 是区分大小写的。对于不区分大小写的写法(转载)

转自&#xff1a;http://justwinit.cn/post/3633/ 默认情况下&#xff0c;find 是区分大小写的。对于不区分大小写的 find&#xff0c;将 -iname 测试替换为 -name 测试。find downloads -iname "*.gif"downloads/.xvpics/Calendar05_enlarged.gifdownloads/lcmgcfe…

ORACLE会话以及SQL执行信息查询

select t.BLOCKING_SESSION,t.SQL_ID,t.SID,t.SERIAL#,t.MACHINE,t.PROGRAM,t.ACTION,t.LOGON_TIME "登录时间",trunc((sysdate - t.LOGON_TIME) * 24 * 60 * 60) || s "登录时长",trunc(nvl(s.ELAPSED_TIME / decode(s.EXECUTIONS, 0, 1, s.EXECUTIONS) /…

Dom4j 学习笔记

dom4j 是一种解析 XML 文档的开放源代码 XML 框架。dom4j下载地址 本文主要记载了一些简单的使用方法。 一、xml文件的解析 dom4j既可以解析普通的xml文件&#xff0c;也可以解析一个InputStream&#xff0c;先看看xml文件长什么样子&#xff1a; <books><book>&l…

交叉连接(CROSS JOIN)的实际应用

一次偶然的机会&#xff0c;使用到了万年不用的交叉连接&#xff08;CROSS JOIN&#xff09; 业务场景如下&#xff1a; 1、存在多个运营商&#xff0c;每个运营商下面都有各种类型的设备&#xff0c;不同运营商的设备不完全相同&#xff1b; 2、任何设备有且仅有两种用途‘…