怎样使代码在main函数前执行,怎样使代码在main函数之后执行

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie

网上有说可以用

__attribute__ ((constructor)) 来让函数在main函数之前执行,

__attribute__ ((destructor)) 来让函数在main函数之后执行。

比如说像下面这样声明函数

void before(void) __attribute__ ((constructor));

void after(void) __attribute__ ((destructor)

不过这不是C/C++标准,它用GCC可能正常编译通过,但用其它的编译器不一定可以编译通过

在标准C/C++中

可以用global variable 或static variable来让代码在main函数之前执行

可以用atexit来让函数在main函数之后执行

#include <iostream>
using namespace std;

int before_main(){
	cout << "before main" << endl;
	return 1;
}
static int a = before_main();

void after_main(){
	cout << "after main" << endl;
}

int main(int argc, char *argv[])
{
	cout << "main" << endl;
	atexit(after_main);
	system("pause");
}

怎样使代码在main函数前执行,怎样使代码在main函数之后执行

时间: 2024-10-18 19:42:49

怎样使代码在main函数前执行,怎样使代码在main函数之后执行的相关文章

main 函数执行以前以及以后,分别还会执行什么代码?(转载)

main函数执行之前,主要就是初始化系统相关资源: 1.设置栈指针 2.初始化static静态和global全局变量,即data段的内容 3.将未初始化部分的全局变量赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容 4.运行全局构造器,估计是C++中构造函数之类的吧 5.将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数 (1)全局对象的析构函数会在main函数之后执行: (2)可以用_onex

main 主函数执行完毕后,是否可能会再执行一段代码?(转载)

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

[Java] JVM 在执行 main 方法前的行为

JVM 执行一个 Java 程序时,先从某个指定的 Java 类的 main 方法开始执行代码,同时,传一个字符串数组作为 main 方法的参数.例如在 Unix 系统上,执行下面的命令 java Test reboot Bob Dot Endzo JVM 会调用 Test 的 main 方法,同时把四个字符串 "reboot", "Bob", "Dot" "Endzo" 作为参数传给 main 方法. 那么,在执行 main

【java】在主函数前输出hello world

在java语言中,main()方法是整个程序的入口,程序在运行时最先加载的就是main()方法,但是这并不意味着main()方法就是程序运行时第一个被执行的模块. 在java语言中,静态代码块在类被加载时就会被调用,因此可以在main()方法前就执行,利用静态代码块实现在主函数之前输出hello world public class staticc {     static     {         System.out.println("hello world");     }  

函数可重入问题reentrant functions(函数执行过程中可以被中断,允许多个副本)

最近经常听到这个名词,以前也听到过,不过接触更多的是“线程安全问题”,而且本人也一直理解的是两个名字的含义是一样的.今天仔细总结一下这个名词相关的概念. 引用博文:可重入函数和不可重入函数 (http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html) 主要用于多任务环境中, 一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误

Keil调试STM32中解析main开始前的工作

Cortex M3的内核有三种启动方式,其分别是: A.通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处: B.通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处: C.通过boot引脚设置可以将中断向量表定位于内置Bootloader区, Cortex-M3内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断入口向量地址,

js函数前加分号和感叹号是什么意思?有什么用?

一般看JQuery插件里的写法是这样的 (function($) { //... })(jQuery); 今天看到bootstrap的javascript组件是这样写的 !function( $ ){ //... }( window.jQuery ); 为什么要在前面加一个 " ! " 呢? 我们都知道,函数的声明方式有这两种 function fnA(){alert('msg');}//声明式定义函数 var fnB = function(){alert('msg');}//函数赋值

在 ASP.NET Core 程序启动前运行你的代码

原文:在 ASP.NET Core 程序启动前运行你的代码 一.前言# 在进行 Web 项目开发的过程中,可能会存在一些需要经常访问的静态数据,针对这种在程序运行过程中可能几乎不会发生变化的数据,我们可以尝试在程序运行前写入到缓存中,这样在系统后续使用时就可以直接从缓存中进行获取,从而减缓因为频繁读取这些静态数据造成的应用数据库服务器的巨大承载压力. 既然需要在程序运行前将静态数据写入到缓存中,毫无疑问我们需要在程序运行前执行一些自定义功能的代码,那么在本章中,我将会介绍如何在 ASP.NET

js函数前加感叹号和分号作用

函数声明方式有两种: 1, function demo(){} //声明式定义函数 2, var demo=function(){} //函数赋值表达式定义函数 我们通常这样调用函数 demo(). 但如果我们为一个"定义函数"末尾加上(),解析器是无法理解的. 如果将函数体部分用()包裹起来就可以运行并且解析器是不报错的: (function() {})() //调用匿名函数 但在前面加上一个布尔运算符(只多了一个感叹号),就是表达式了,将执行后面的代码,也就合法实现调用 !func