前天面试,突然遇到上面的这个题目,我当时想直接做个全局类就能解决
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`函数开始前执行函数的机制,但通过编译器特定的扩展,我们可以实现类似的功能。在GCC中,`__attribute__((constructor))`和`__attribute__((destructor))`是很好的选择,...
main函数执行前的准备工作,包括对堆栈的进一步配置,以及调用其他一些系统或用户定义的初始化函数,如配置外设、初始化操作界面等。 四、scatterload函数分析 在启动文件中,scatterload函数主要用于加载系统配置...
在C语言中,每个程序都始于`main()`函数,它是程序执行的起点。当我们谈论`main()`函数的两个参数`argc`和`argv`时,我们实际上是在讨论如何处理命令行参数。这些参数是在程序启动时由操作系统传递给程序的,通常在...
main 函数是 C/C++ 语言中的入口函数,即程序的开始执行点。在控制台程序中,main 函数可以接收参数,这些参数可以来自操作系统的命令行。了解 main 函数的参数传递机制对编写控制台程序非常重要。 main 函数的参数...
### 深入KEIL底层之__main函数详解 #### 1. KEIL中__main函数介绍 **1.1 __main主要作用** 在KEIL环境下,`__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`函数是程序的入口点。当程序启动时,操作系统会寻找并执行`main`函数内的代码。 C语言的语句可以分为五类: 1. **控制语句**: ...
### C语言面试题:Main函数详解 #### 题目背景 在C语言编程中,`main`函数是每个程序的入口点。正确理解和编写`main`函数对于编写高质量、可移植性强的程序至关重要。本篇文章将深入探讨C语言中的`main`函数,包括...
在编程世界中,`main`函数是每个C/C++程序的入口点,它标志着程序执行的开始。在标题“main函数的两个参数”中提到的,实际上是指`main`函数可以接受两个参数,这是一个在标准C/C++中不常用但仍然合法的特性。通常...
以下是在`main`函数执行前发生的几个关键步骤: 1. **初始化全局变量**:所有的全局变量都会被初始化到默认值或程序员指定的初始值。静态局部变量也会在这个阶段被初始化。 2. **构造函数调用**:对于具有构造函数...
本文旨在通过详细分析《__main函数内幕——从加载视图到执行视图.pdf》中的内容,揭示这一转变背后的奥秘。 **加载视图与执行视图的概念** 在讨论具体细节之前,首先需明确加载视图与执行视图的概念。加载视图是指...
在写 C++ 的题目的时候经常会遇到这样的问题,写了多个 cpp 文件,在 clion 中编译报错不能同时存在多 main 函数 这里写了一个小程序优雅地解决这个问,非常简单,就是就是读字符串写文件 直接修改一下 CMake 自动...
- 对于STM32,可能需要在`Startup`文件中正确配置启动地址,确保程序从`main`函数开始执行。 7. **错误日志检查**: - 查看Keil5的输出窗口,其中可能包含关于调试问题的错误或警告信息,这些信息有助于定位问题...
当我们谈论"main函数源码-战舰开发板"时,我们很可能指的是一个特定的嵌入式系统项目,其中`main`函数是针对某种叫做“战舰开发板”的硬件平台编写的。这个开发板可能是用于教育、实验或者产品原型设计,它集成了微...
一般代码只能从main方法开始,main结束后结束 这里给出一种方法,可以在main之前执行代码、在main结束后执行一些代码
固定架允许在测试开始前和结束后执行初始化和清理操作。 4. **参数化测试**:`gtest` 支持参数化测试,允许你为同一测试用例提供多种输入,检查各种情况。 5. **测试套件 (Test Suites)**:可以将相关的测试用例...
在C编程中,有时我们需要在`main`函数执行前执行某些特定的初始化操作,例如注册全局对象或设置环境。为了实现这一目标,C语言提供了一种特性,允许我们定义在`main`函数之前调用的函数。这在设计复杂的软件系统,...