标签:
1、首先,想想C/C++在main函数之前和之后会做些什么?
我们看看底层的汇编代码:
__start:
:
init stack;
init heap;
open stdin;
open stdout;
open stderr;
:
push argv;
push argc;
call _main; (调用 main)
:
destory heap;
close stdin;
close stdout;
close stderr;
:
call __exit;
我们可以看到main函数也只是其中的一个函数调用而已。
在调用main函数之前,会先进性初始化栈,堆,打开标准输入,输出,错误流,把参数压栈。还有一些全局变量、对象和静态变量、对象的空间分配和赋初值。
在调用main函数之后,要销毁堆内存,关闭标准输入,输出,错误流。
这些都是编译器帮助我们自动生成的,帮助我们启动main函数。
2、main()函数及其参数
C++标准允许主函数main()有或没有参数列表。 您能在主函数main()中使用一个或更多的参数。 如下是一些惯例:
int main(int argc, char *argv[])
第一个参数argc,指明有多少个参数将被传递给主函数main(),真正的参数以字符串数组(即第2个参数argv[])的形式来传递。每一个字符串均有自己意思。在这句法上面, 记住, argc代表参数的数量, main()函数本身是在索引0为的第一参数。 所以, argc总是至少为1 。它的总数是从argv列阵的元素数目。 这意味着, argv[0]的值是至关重要的。 如果用户在控制台环境中程序名称后键入含参数的指令, 那么随后的参数将传递给argv[1]。
例如:在vs2015中构建代码,
#include <stdio.h> int main(int argc, char *argv[]) { int i; for (i = 0; i < argc; i++) printf("Argument %d is %s.\n", i, argv[i]); return 0; }
保存并编译后,程序名称为---vs2015之main参数测试,在cmd中键入:
因为在LINUX或DOS中, 使用命令后面一般都加上参数等
3、C/C++中如何在main()函数之前执行一条语句?
(1)在C++中,利用全局变量和构造函数的特性,通过全局变量的构造函数执行
#include <Iostream> using namespace std; class TestClass { public: TestClass(); }; TestClass::TestClass() { cout<<"TestClass"<<endl; } TestClass Ts;//定义个全局变量,让类里面的代码在main之前执行 int main() { cout<<"main"<<endl; return 0; }
执行结果:
(2)、全局变量的赋值函数
#include <iostream> using namespace std; int foo(void); int i = foo(); int foo(void) { cout << "before main" << endl; return 0; } int main(void) { cout << "i‘m main" << endl; }
执行结果:
(3)、指定入口点,入口点中调用原来的入口点
标签:
原文地址:http://www.cnblogs.com/carsonzhu/p/5276317.html