|
我之所以提出这个问题,缘于一些IT公司招聘开发人员的笔试题或者面试题:C++ 中能不能让一些代码在 main() 之前或者之后执行? 答案理所当然可以的。 这可以有很多实现方法。下面例举: 1、一般来说,全局域的变量(包括静态变量)赋值、初始化等工作都是在main之前执行的。此时初始化变量调用的普通赋值函数,初始化对象调用的类的构造函数,都是行之有效的方法。 比较典型的是静态变量通过静态函数赋值、静态对象的初始化,这不仅对于C++,对于其他编程语言,如Java或C#也同样适用。 如main()函数之前: example 1.1 one of C++ samples class Dummy { Dummy dummy; int main() { example 1.2: one of Java samples public static void main(String[] args) { 同理,利用全局域的变量(包括静态变量)的析构可以在main() 之后执行代码。 example 1.3 one of C++ samplesclass A A a; int main(void) { example 1.3 one integrated of C++ samples int c = main(521);
Output: 如果把int c = main(521);这一行放到最后,输出则会变为: This is A's constructor.This is executed with 521. This is executed with 1. This is executed next. 下面再给一段代码,大家想一想执行以后会输出什么? example 1.4 in C++ int main(int argc) { class A A a; Output: 可以看到extern关键字对变量的初始化时机没有任何影响;同时,全局int如果不赋值其值为0(double同样)。 java也是可以在main()之前调用main()函数的: example 1.5 in Java public class Test { public static void main(String[] args) { 这充分说明了同C++一样,Java的main()也只不过是呈现给程序员的表面的符号而已。 2、调用C的库函数。 main()之前执行: example 2.1 在GCC中可以这样 void first() __attribute__ ((constructor)); int main() { void first() { main() 之后执行:CRT会执行另一些代码,进行处理工作。使用atexit()或_onexit()函数,注册一个函数。 example 2.2 #include <stdlib.h> void fn1(void),fn2(void),fn3(void),fn4(void); int main(void){ void fn1(){ void fn2(){ void fn3(){ void fn4(){ 3、修改定义main入口的文件。main入口其实是由编译器提供的一个库文件定义的,并不是固化在编译器内核的。因此如果需要的话,可以随意更改。当然我们并不建议这样。 在 windows 下看 VC的源代码里有 crt0.c 这个源文件,这个就是定义main入口的文件,如果你愿意可以在里面加任何语句,然后重新编译。在VC里大概是这个样子: void __cdecl __crt0 ( #ifndef _M_MPPC /* This is the magic stuff that MPW tools do to get info from MPW*/ pv = (void *)*(int *)0x316; #endif /* _M_MPPC */ _environ = NULL; #ifndef _M_MPPC Inherit(); /* Inherit file handles - env is set up by _envinit if needed */ /* mainret = main(__argc, __argv, _environ); 注意:每个编辑器的实现是不一样的。 4、利用多线程。这对于目前大多编程语言都适用。 example 稍候。 总结: 其实main 是在 区别一下,系统在main前和main后,是为我们做了很多工作的,单单一个空的main,如果你用汇编级调试器去调试之后,发现起点不是main,而main只是其中一个空函数而已。 |
[转]main 之前与之后
最新推荐文章于 2023-12-30 16:13:26 发布
本文探讨了在C++中如何使某些代码在main()函数之前或之后执行的方法。文章详细介绍了通过全局变量初始化、C库函数调用、修改main入口文件及使用多线程等手段实现该目标。
【转自CLive Studio 百度空间】
2402

被折叠的 条评论
为什么被折叠?



