C语言中怎么在main函数开始前执行函数
在gcc中,可以使用attribute关键字,声明constructor和destructor,代码如下:
代码如下:
#include <stdio.h>
__attribute((constructor)) void before_main()
{
printf("%s/n",__FUNCTION__);
}
__attribute((destructor)) void after_main()
{
printf("%s/n",__FUNCTION__);
}
int main( int argc, char ** argv )
{
printf("%s/n",__FUNCTION__);
return 0;
}
vc不支持attribute关键字,在vc中,可以使用如下方法:
代码如下:
#include <stdio.h>
int
main( int argc, char ** argv )
{
printf("%s/n",__FUNCTION__);
return 0;
}
int before_main()
{
printf("%s/n",__FUNCTION__);
return 0;
}
int after_main()
{
printf("%s/n",__FUNCTION__);
return 0;
}
typedef int func();
#pragma data_seg(".CRT$XIU")
static func * before[] = { before_main };
#pragma data_seg(".CRT$XPU")
static func * after[] = { after_main };
#pragma data_seg()
编译执行,上述两段代码的结果均为:
before_main
main
after_main
可以在main前后调用多个函数,在gcc下使用attribute声明多个constructor、destructor,vc下在before、after数组中添加多个函数指针。
相关推荐
-
C语言main函数的三种形式实例详解
在C语言中,main()函数有三种形式. 1.无参数 #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } 2.有两个参数 习惯上第一个参数是整型argc,保存了外部调用命令的参数个数,第二个参数是指针数组或二级指针argv,以字符串形式保存了与argc对应的参数,如下例子: #include <stdio.h> int main(int argc, char* arg
-
C语言之没有main函数的helloworld示例
几乎所有程序员的第一堂课都是学习helloworld程序,下面我们先来重温一下经典的C语言helloworl 复制代码 代码如下: /* hello.c */ #include <stdio.h> int main() { printf("hello world!\n"); return 0; } 这是一个简单得不能再单的程序,但它包含有一个程序最重要的部分,那就是我们在几乎所有代码中都能看到的main函数,我们编译成可执行文件并查看符号表,
-
c语言main函数使用及其参数介绍
每一C程序都必须有一main()函数,可以根据自己的爱好把它放在程序的某个地方.有些程序员把它放在最前面,而另一些程序员把它放在最后面,无论放在哪个地方,以下几点说明都是适合的. 在Turbo C2.0启动过程中,传递main()函数三个参数:argc,argv和env.* argc:整数,为传给main()的命令行参数个数.* argv:字符串数组.char* argv[],我们可以看出,argv的类型是char* [],即是一个指向字符数组的指针,所以我们还可以写作:char** argv.
-
C语言main函数的参数及其返回值详细解析
返回值的作用 main函数的返回值用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出.下面我们在winxp环境下做一个小实验.首先编译下面的程序:int main( void ){ return 0;}然后打开附件里的"命令提示符",在命令行里运行刚才编译好的可执行文件,然后输入"echo%ERRORLEVEL%",回车,就可以看到程序的返回值为0.假设刚才编译好的文件是a.exe,如果输入&
-
C语言中怎么在main函数开始前执行函数
在gcc中,可以使用attribute关键字,声明constructor和destructor,代码如下: 复制代码 代码如下: #include <stdio.h> __attribute((constructor)) void before_main(){ printf("%s/n",__FUNCTION__);} __attribute((destructor)) void after_main(){ printf("%s/n",__FUNCTIO
-
浅析Javascript匿名函数与自执行函数
函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 函数的定义,大致可分为三种方式: 第一种:这也是最常规的一种 function double(x){ return 2 * x; } 第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用. var double = new Function('x', 'return 2 * x;'); 第三种: var double = function(
-
C语言中调用Swift函数实例详解
C语言中调用Swift函数实例详解 在Apple官方的<Using Swift with Cocoa and Objectgive-C>一书中详细地介绍了如何在Objective-C中使用Swift的类以及如何在Swift中使用Objective-C中的类.在后半部分也介绍了如何在Swift中使用C函数,不过对于如何在C语言中使用Swift函数却只字未提.这里我就为大家分享一下如何在C语言中调用Swift函数. 我们首先要知道的是,所有Swift函数都属于闭包.其次,Swift函数的调用约定与
-
JavaScript自执行函数和jQuery扩展方法详解
我们通常将JS代码写在一个单独的JS文件中,然后在页面中引入该文件.但是,有时候引入后会碰到变量名或函数名与其它JS代码冲突的问题.那么如何解决这个问题呢?作用域隔离.在JS中,作用域是通过函数来划分的,将JS代码封装到函数中进行调用可以避免变量名/函数名冲突的问题,但是这也并不是万无一失,因为封装函数本身有可能和其它函数重名,解决方案:自执行函数. 自执行函数是用一对圆括号将匿名函数包起来,加括号(传参)会立即执行.因为函数无名字,实现了作用域的绝对隔离和函数名的冲突问题.基本形式如下: (f
-
JavaScript立即执行函数用法解析
我们知道,在一般情况下,函数必须先调用才能执行,如下所示,我们定义了一个函数,并且调用, function fn(){ console.log(1); } fn(); 打印结果为: 如果不调用的话,我们打印的结果永远不会显示. 所以这里就会提到我们的立即执行函数,所谓立即执行函数,就是不需要调用,立马就能执行的函数. 立即执行函数有两种最常见的写法: (function(){})() (function(){}()) 举个例子: (function
-
JavaScript基础之立即执行函数
目录 立即执行函数格式 立即执行函数其他方式–表达式 立即执行函数可以带参数 应用 总结 在JavaScript中有时候看到一些很神奇的函数比如下面截图: 这种函数只要浏览器加载的时候会自动运行,而需要调用,前面在闭包的时候也说过这种函数,一般将其称之为:立即执行函数. 立即函数的特征: 会自动执行 只会执行一次 立即执行函数格式 立即执行函数一般有格式如下: # 格式一(//W3C 推荐这种写法) (function (){ }()) #格式二 (但是这个才是最常用的方式之一) (functi
-
Go语言中的延迟函数defer示例详解
前言 大家都知道go语言的defer功能很强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦.Go 语言中延迟函数 defer 充当着 try...catch 的重任,使用起来也非常简便,然而在实际应用中,很多 gopher 并没有真正搞明白 defer.return.返回值.panic 之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘面纱!话不多说了,来一起看看详细的介绍吧. 先来运行下面两段代码: A. 匿名返回值的情况 package main import ( "fmt&qu
-
Go语言中的流程控制结构和函数详解
这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和无条件跳转. if if也许是各种编程语言中最常见的了,它的语法概括起来就是:如果满足条件就做某事,否则做另一件事. Go里面if条件判断语句中不需要括号,如下代码所示: 复制代码 代码如下: if x > 10 { fmt.Println("x is greater than 10&
-
深入讲解Go语言中函数new与make的使用和区别
前言 本文主要给大家介绍了Go语言中函数new与make的使用和区别,关于Go语言中new和make是内建的两个函数,主要用来创建分配类型内存.在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用,话不多说了,来一起看看详细的介绍吧. 变量的声明 var i int var s string 变量的声明我们可以通过var关键字,然后就可以在程序中使用.当我们不指定变量的默认值时,这些变量的默认值是他们的零值,比如int类型的零值是0,st
-
C语言中函数指针的三种使用方法总结
C语言中函数指针的三种使用方法总结 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能使彼此更加成长. 定义方式:int (*p)(int x, int y); 实现代码: #include <stdio.h> int sum(int x, int y){ return x + y; } int reduce(int x, int y){ return x - y; } int
随机推荐
- Vue内容分发slot(全面解析)
- 通过U盘实现本机添加管理员权限
- perl引用的相关知识分享
- js中各浏览器中鼠标按键值的差异
- C#异常处理总结及简单实例
- Bootstrap模态窗口源码解析
- ORACLE 回收站当前状态查询整理
- jQuery+css3实现Ajax点击后动态删除功能的方法
- jQuery中is()方法用法实例
- Js智能判断浏览器是关闭还是刷新的代码
- JavaScript Try...Catch 声明的 使用方法
- C#如何防止程序多次运行的技巧
- Java中的private、protected、public和default的区别(详解)
- C#发送数据到剪贴板及从剪贴板中取数据的方法
- 在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
- Android UI效果之绘图篇(三)
- Android使用JobScheduler定期推送本地通知实例代码
- PHP+Redis 消息队列 实现高并发下注册人数统计的实例
- 使用WebSocket实现即时通讯(一个群聊的聊天室)
- 详解JAVA使用Comparator接口实现自定义排序