`
tcspecial
  • 浏览: 914408 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

怎么在main函数开始前执行函数

阅读更多

    前天面试,突然遇到上面的这个题目,我当时想直接做个全局类就能解决

        

void before_main()
{
	printf("%s\n",__FUNCTION__);
}

void after_main()
{
	printf("%s\n",__FUNCTION__);
}

class Test {
public:
	Test(){ before_main(); }
	~Test(){ after_main(); }
}

Test test;  // 全局类变量,在main前调用构造,在main结束后,调用析构函数

int main(int argc,char **argv)
{
	printf("%s\n",__FUNCTION__);
	return 0;
}

 

   上面是用C++实现的,面试官问如果用C,如何实现,谷歌了一下,发现真有解决方案,只是利用了编译器一些特性实现罢了,不知这样面试可有意义.

   在GCC中,可以使用attribute关键字,声明constructor和destructor,代码如下:

   

// 可声明多个constructor,在main前调用多个函数
__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;
}

 

   在VC6中,不支持attribute关键字,可使用如下方法(未在vs2010下测试通过,after_main没有执行):

   

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()

 

分享到:
评论

相关推荐

    C语言中怎么在main函数开始前执行函数

    总的来说,C语言本身并没有直接提供在`main`函数开始前执行函数的机制,但通过编译器特定的扩展,我们可以实现类似的功能。在GCC中,`__attribute__((constructor))`和`__attribute__((destructor))`是很好的选择,...

    MDK main函数运行前的分析

    main函数执行前的准备工作,包括对堆栈的进一步配置,以及调用其他一些系统或用户定义的初始化函数,如配置外设、初始化操作界面等。 四、scatterload函数分析 在启动文件中,scatterload函数主要用于加载系统配置...

    关于main函数两个参数

    在C语言中,每个程序都始于`main()`函数,它是程序执行的起点。当我们谈论`main()`函数的两个参数`argc`和`argv`时,我们实际上是在讨论如何处理命令行参数。这些参数是在程序启动时由操作系统传递给程序的,通常在...

    main函数传递参数

    main 函数是 C/C++ 语言中的入口函数,即程序的开始执行点。在控制台程序中,main 函数可以接收参数,这些参数可以来自操作系统的命令行。了解 main 函数的参数传递机制对编写控制台程序非常重要。 main 函数的参数...

    深入KEIL底层之__main函数详解

    ### 深入KEIL底层之__main函数详解 #### 1. KEIL中__main函数介绍 **1.1 __main主要作用** 在KEIL环境下,`__main`函数承担着程序运行环境的初始化任务,它进行了一系列底层操作来确保程序能够正常运行。这些操作...

    Android studio 运行main 函数的方法

    PS:下面通过示例代码看下JAVA中的main函数 package com.han; public class HanTest { public static void main(String[] args){ if(args==null){ throw new NullPointerException(The input is \null\); }...

    运行C程序总是从main函数开始。

    在C语言编程中,程序的执行始终从`main`函数开始。这是C程序的基本结构,因为`main`函数是程序的入口点。当程序启动时,操作系统会寻找并执行`main`函数内的代码。 C语言的语句可以分为五类: 1. **控制语句**: ...

    c语言面试题----main函数

    ### C语言面试题:Main函数详解 #### 题目背景 在C语言编程中,`main`函数是每个程序的入口点。正确理解和编写`main`函数对于编写高质量、可移植性强的程序至关重要。本篇文章将深入探讨C语言中的`main`函数,包括...

    main函数的两个参数

    在编程世界中,`main`函数是每个C/C++程序的入口点,它标志着程序执行的开始。在标题“main函数的两个参数”中提到的,实际上是指`main`函数可以接受两个参数,这是一个在标准C/C++中不常用但仍然合法的特性。通常...

    main函数之前与之后

    以下是在`main`函数执行前发生的几个关键步骤: 1. **初始化全局变量**:所有的全局变量都会被初始化到默认值或程序员指定的初始值。静态局部变量也会在这个阶段被初始化。 2. **构造函数调用**:对于具有构造函数...

    __main函数内幕——从加载视图到执行视图.pdf

    本文旨在通过详细分析《__main函数内幕——从加载视图到执行视图.pdf》中的内容,揭示这一转变背后的奥秘。 **加载视图与执行视图的概念** 在讨论具体细节之前,首先需明确加载视图与执行视图的概念。加载视图是指...

    如何在 clion 运行多个 main 函数(方法详解)

    在写 C++ 的题目的时候经常会遇到这样的问题,写了多个 cpp 文件,在 clion 中编译报错不能同时存在多 main 函数 这里写了一个小程序优雅地解决这个问,非常简单,就是就是读字符串写文件 直接修改一下 CMake 自动...

    keil5调试没有箭头或不进入main函数.docx

    - 对于STM32,可能需要在`Startup`文件中正确配置启动地址,确保程序从`main`函数开始执行。 7. **错误日志检查**: - 查看Keil5的输出窗口,其中可能包含关于调试问题的错误或警告信息,这些信息有助于定位问题...

    main函数源码

    当我们谈论"main函数源码-战舰开发板"时,我们很可能指的是一个特定的嵌入式系统项目,其中`main`函数是针对某种叫做“战舰开发板”的硬件平台编写的。这个开发板可能是用于教育、实验或者产品原型设计,它集成了微...

    在程序main开始、结束之后执行代码

    一般代码只能从main方法开始,main结束后结束 这里给出一种方法,可以在main之前执行代码、在main结束后执行一些代码

    gtest的框架,已经写好了一个main函数

    固定架允许在测试开始前和结束后执行初始化和清理操作。 4. **参数化测试**:`gtest` 支持参数化测试,允许你为同一测试用例提供多种输入,检查各种情况。 5. **测试套件 (Test Suites)**:可以将相关的测试用例...

    在main函数之前调用函数,以及对设计的作用.pdf

    在C编程中,有时我们需要在`main`函数执行前执行某些特定的初始化操作,例如注册全局对象或设置环境。为了实现这一目标,C语言提供了一种特性,允许我们定义在`main`函数之前调用的函数。这在设计复杂的软件系统,...

Global site tag (gtag.js) - Google Analytics