C++ main()函數及其參數


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM