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)、指定入口點,入口點中調用原來的入口點