精华内容
下载资源
问答
  • gcc中: 可以使用attribute关键字,声明constructor和destructor,代码如下: #include <stdio.h> __attribute((constructor)) void before_main() { printf("%s/n",__FUNCTION__); } __...

    可以使用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中:

    vc不支持attribute关键字,在vc中,可以使用如下方法:

    view plain
    #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

    (vc中可能不支持__FUNCTION__来获得函数名,你可以用另外的方式来获取,比如在befor_main()函数中printf("befor_main()\n");来模拟__FUNCTION__的功能!嘿嘿)

    可以在main前后调用多个函数,在gcc下使用attribute声明多个constructor、destructor,vc下在before、after数组中添加多个函数指针

    展开全文
  • main函数执行前后的代码

    千次阅读 2013-01-28 15:14:08
    一、main结束 不代表整个进程结束 ... (2)一些全局变量、对象和静态变量、对象的空间分配和赋初值就是在执行main函数之前,而main函数执行完后,还要去执行一些诸如释放空间、释放资源使用权等操
    一、main结束 不代表整个进程结束
      (1)全局对象的构造函数会在main 函数之前执行,
              全局对象的析构函数会在main函数之后执行;
              用atexit注册的函数也会在main之后执行。
      (2)一些全局变量、对象和静态变量、对象的空间分配和赋初值就是在执行main函数之前,而main函数执行完后,还要去执行一些诸如释放空间、释放资源使用权等操作
      (3)进程启动后,要执行一些初始化代码(如设置环境变量等),然后跳转到main执行。全局对象的构造也在main之前。
    二、main()之后执行的代码,用atexit注册的函数也会在main之后执行

    1. #include <iostream>  
    2. void fn1(void)  
    3. {  
    4.     printf("next.\n");   
    5. }  
    6.   
    7. void fn2(void)  
    8. {  
    9.     printf("executed ");   
    10. }  
    11.   
    12. void fn3(void)  
    13. {  
    14.     printf("is ");   
    15. }  
    16.   
    17. void fn4(void)  
    18. {  
    19.     printf("This ");  
    20. }   
    21.   
    22. int main(void)  
    23. {  
    24.     //   
    25.     // 注册需要在 main 函数结束后执行的函数.    
    26.     // 请注意它们的注册顺序和执行顺序  
    27.     // 在 main 函数结束后被调用,调用顺序与注册顺序相反。 先注册后执行。  
    28.     //  
    29.   
    30.     atexit(fn1);  
    31.     atexit(fn2);  
    32.     atexit(fn3);  
    33.     atexit(fn4);  
    34.   
    35.     // 这条输出语句具有参照性,它可不是最后一句输出.   
    36.     puts("This is executed first.");   
    37.   
    38.     // EXIT_SUCCESS 代表 0,它定义在 stdlib.h 中.   
    39.     // 我只是顺便提一下,也许你知道,但我担心你不知道,呵呵.   
    40.     //  
    41.     return EXIT_SUCCESS;  
    42. }  
    关于atexit函数我的稍微补充一下,原型如下:
    1. int atexit(void (*func)(void));   
       atexit 函数是标准 C 新增的。它“注册”一个函数,使这个函数将在 exit 函数被调用时或者当 mian 函数返回时被调用。当程序异常终止时(例如调用 abort 或 raise),通过它注册的函数并不会被调用。编译器必须至少允许程序员注册32个函数。如果注册成功,atexit 返回0,否则返回非零值。没有办法取消一个函数的注册。在 exit 所执行的任何标准清理操作之前,被注册的函数按照与注册顺序相反的顺序被依次调用。每个被调用的函数不接受任何参数,并且返回类型是 void。被注册的函数不应该试图引用任何存储类别为 auto 或 register 的对象(例如通过指针),除非是它自己所定义的。多次注册同一个函数将导致这个函数被多次调用。有些传统 C 编译器用 onexit 这个名称实现了像是的功能。
       atexit是注册后进先出的函数,和函数入栈出栈是一样的。
       在这里注册了四个函数,理解为入栈的顺序为fn1() -> fn2() -> fn3() -> fn4();出栈的顺序正好相反,而什么时候出栈呢?就是在调用函数结束时,准确的说应该是函数调用的最后的操作就是出栈过程。main()同样也是一个函数,在结束时,按出栈的顺序调用四个函数,即为fn4() -> fn3() -> fn2() -> fn1();

       注册这个函数的目的就是为了在函数退出时调用的,即使是main()函数也是这样的。可以在这些函数中加入一些清理工作,比如内存释放等等。

    出处:http://blog.csdn.net/huang_xw/article/details/8542105

    展开全文
  • gcc中,可以使用attribute关键字,声明constructor和destructor,代码如下:#include __attribute((constructor)) void before_main() { printf("%s/n",__FUNCTION__); } __attribute((destructor)) void after_...

    在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数组中添加多个函数指针。

    展开全文
  • 在main函数之外执行函数的情

    千次阅读 2014-08-20 10:37:03
    在main函数之外执行函数的情况

    1、onexit函数

    #include "stdafx.h"
    #include "iostream"
    #include <stdlib.h>
    using namespace std;
    
    int func()								//必须为int返回值
    {
    	cout<<"This is after main function"<<endl;
    	system("pause");
    	return 0;
    }
    
    int main(int argc,char*argv[])
    {
    	onexit(func);
    	cout<<"This is main function"<<endl;
    	system("pause");
    	return 0;
    }
    


    2、全局对象的构建

    #include "stdafx.h"
    #include "iostream"
    #include <stdlib.h>
    using namespace std;
    
    class A
    {
    public:
    	A()
    	{
    		cout<<"This is A's constructor"<<endl;
    	}
    };
    
    A a;
    
    int main(int argc,char*argv[])
    {
    	cout<<"This is the main function"<<endl;
    	system("pause");
    	return 0;
    }
    


    3、析构函数的调用

    #include "stdafx.h"
    #include "iostream"
    #include <stdlib.h>
    using namespace std;
    
    class A
    {
    public:
    	A()
    	{
    		cout<<"This is A's constructor"<<endl;
    	}
    	~A()
    	{
    		cout<<"This is A's deconstructor"<<endl;
    		system("pause");
    	}
    };
    
    A(a);
    int main(int argc,char*argv[])
    {
    	cout<<"This is the main function"<<endl;
    	system("pause");
    	return 0;
    }
    


    展开全文
  • 问题描述C/C++语言执行过程中是不是所有的动作都由main()函数引起,来看下面的代码:#include class A{public: A() { printf("This is Constructor\n"); } ~A() { printf("This is destructor\n"); } };A a;
  • C程序的执行是从main函数开始的,如果在main函数中调用其他函数,调用后流程返回到main函数在main函数中结束整个程序的运行。  这段有些莫名其妙的文字即使从汉语语法的角度来说也成问题。成问题的地方在于...
  • 注册C函数在main函数前执行

    千次阅读 2012-09-20 21:28:43
    定义一个C函数: void CInit() {  atexit(CExit);  printf("4\n"); } 将一CInit函数指针存放到 ".CRT$XC*"段中 (*为B-Y之间) typedef void (__cdecl *PVFV)(); #pragma section(".CRT$XCD", long, read) ...
  • 本文介绍运行时库实现的功能,你会看到在main函数执行之前都做了什么操作!
  • 从事嵌入式开发的伙伴可能会思考过一个问题,我们一般都是使用芯片厂商提供的驱动库和初始化文件,直接从main函数开始写程序,那么系统上电之后,程序怎么引导进main函数执行的呢?还有,系统上电之后RAM的数据是...
  •  gcc中,可以使用attribute关键字,声明constructor和destructor,代码如下: #include __attribute((constructor)) void before_main() { printf("%s/n",__FUNCTION__); } __attribute(...
  • 之前的文章中,介绍了main函数的返回值 和 main函数的传参,本文主要介绍一下main函数执行顺序。可能有的人会说,这还用说,main函数肯定是程序执行的第一个函数。那么,事实果然如此吗?相信看了本文之后,会...
  • c/c++中,我们都知道main函数是程序开始执行的地方,但是进行反调试的时候,很多时候都需要调试检测函数在main函数之前执行。以下为总结的方法,如果有别的方法,欢迎不吝赐教。 1.将要执行的代码写到类的构造...
  • C语言 带参数的main函数的编译运行

    千次阅读 2019-05-27 10:39:18
    这里主要介绍的是C99标准下的C语言main函数形式。C语言中,main函数可以带参数也可以不带参数。 不带参数的main函数格式为: main() //它实际上是 main(void)的简写 C语言中如果miain函数需要带参数,带参数的...
  • 普通的java工程里,main函数可以执行,但是maven工程中, main函数运行1秒后停止,控制台没有输出。java没问题,maven没问题。 # 偶尔会弹出连接不到虚拟机。
  • 我们通常认为C语言的起始函数是main()函数,实质上一个程序的启动函数并不一定是main()函数,这个可以采用链接器来设置,但是gcc中默认main()就是C语言的入口函数,在main函数启动之前,内核会调用一个特殊的...
  • c语言中在main函数之前会执行什么

    千次阅读 2015-11-08 20:39:14
    一般程序中都是认为C语言程序在运行过程中,是由Main函数开始,最后到Main函数结束。 实际上,执行文件被加载之后,控制权立即交给由编译器插入的Start函数,它将对后面这些全局变量进行准备: _osver 操作...
  • 转自:https://www.cnblogs.com/yjd_hycf_space/p/7495640.html 全局对象的构造函数会在main函数之前执行
  • static变量在Main函数之前执行

    千次阅读 2013-05-27 17:39:42
    c/c++语言中,在执行main的入口函数之前,是会首先执行一段代码。 而对于全局变量和static的初始化就是 在main函数之前执行的,例子如下: #include #include class static_name { public: static_name(){}...
  • 这是面试中被问到的一个问题,回答了是。这问题第一感觉答案就是否定的,一时也没想出来理由只能回答了是。当时太紧张了,其实回想一下汇编语言就该想到程序的入口地址是可以指定的,c语言编译器默认以main作为...
  • c++中static变量在main函数之前执行

    千次阅读 2016-09-28 21:56:33
    c/c++语言中,在执行main的入口函数之前,是会首先执行一段代码。 而对于全局变量和static的初始化就是 在main函数之前执行的,例子如下: [cpp] view plain copy   #include    ...
  • 深度剖析c语言main函数---main函数的返回值

    万次阅读 多人点赞 2018-07-09 23:19:06
    接下来的几篇博文中,我将对c语言的main函数进行深入的剖析,分别从函数返回值,函数参数,以及函数的执行顺序对main函数作一总结。本文主要聊聊main函数的返回值。 main函数的返回值  main函数的返回值用于...
  • 如何在main函数外获取main函数的参数(argc、argv)在main函数主函数外不采用全局变量的方式获取argc、argv调用attribute,程序的.init_array字段添加指定函数地址,其传入的参数中就有argc、argv参数。...
  • #include using namespace std; class CTest { public: CTest() { cout 构造函数..." ; } ~CTest() ... cout 析构函数..." ;...int main() { CTest t; return 0; } 可见:全局对象的构造函数
  • C++ main 函数 之前执行一段代码

    千次阅读 2018-02-07 10:55:26
    一个C++的程序,要先从main函数执行起,这是基本的编程常识,但是我们却可以在main函数执行之前先来执行一段代码,这是利用全局变量和构造函数的特性,再有全局变量的时候要先创建全局变量,然后在执行main函数 ...
  • 今晚突然脑中出现了这个问题,于是通过查找一些资料来进行一下解答。 要实现这个功能就需要使用atexit()函数,乍一看似乎是和exit...main函数结束时也会隐式地调用exit()函数。 原型:void exit(int state); sta
  • https://blog.csdn.net/qq_38211852/article/details/80086071 https://www.cnblogs.com/klcf0220/p/5663487.html
  • linux中,可以使用attribute关键字,声明constructor和destructor,代码如下: //Test.c #include __attribute((constructor)) void before_main() { printf("%s\n",__FUNCTION__); } __attribute(...
  • main函数执行之前,主要就是初始化系统相关资源: 1.设置栈指针 2.初始化static静态和global全局变量,即data段的内容 3.将未初始化部分的全局变量赋初值:数值型short,int,long等为0,bool为FALSE,指针...
  • pytest通过main函数运行用例

    千次阅读 2018-10-09 20:39:00
    我们学习pytest的时候,很多时候通过cmd命令去执行用例,大部分时间我们是通过IDE去编写Code,为了方便运行,我们可以使用pytest提供的pytest.main()函数运行我们的测试脚本或者例子 例子 运行结果:   ...
  • 脱离tomcat容器单独的java application的main函数中初始化spring

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,496,368
精华内容 998,547
关键字:

在main函数执行前运行的函数