欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言中main函數(shù)與命令行參數(shù)詳細(xì)講解

 更新時(shí)間:2022年04月18日 15:39:44   作者:清風(fēng)自在 流水潺潺  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言main()函數(shù)與命令行參數(shù)問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

一、main 函數(shù)的概念

  • C語(yǔ)言中 main 函數(shù)稱之為主函數(shù)
  • 一個(gè)C程序是從 main 函數(shù)開始執(zhí)行的

二、main 函數(shù)的本質(zhì)

  • main 函數(shù)是操作系統(tǒng)調(diào)用的函數(shù)
  • 操作系統(tǒng)總是將 main 函數(shù)作為應(yīng)用程序的開始
  • 操作系統(tǒng)將 main 函數(shù)的返回值作為程序的退出狀態(tài)

下面看一下 main 函數(shù)的返回值:

A.c:

#include <stdio.h>
 
int main()
{
	printf("I'm A!\n");
	return 0;
}

B.c:

#include <stdio.h>
 
int main()
{
	printf("I'm B!\n");
	return 99;
}

在 windows 下通過(guò) VS012 命令行編譯代碼,如果對(duì)命令行編譯不熟悉,請(qǐng)看《命令行》,否則跳過(guò)該部分

以B.c 為例,編譯后通過(guò) echo %ERRORLEVEL% 命令后,看到返回值為 99

下面再來(lái)進(jìn)行一個(gè)實(shí)驗(yàn),先將 A 進(jìn)行編譯,然后輸入 B.exe && A.exe,發(fā)現(xiàn)只打印出 I'm B!,因?yàn)?B.exe運(yùn)行結(jié)束后操作系統(tǒng)返回了 99,99 在操作系統(tǒng)看來(lái) B.exe 沒(méi)有正常運(yùn)行退出,所以操作系統(tǒng)就不會(huì)運(yùn)行 A.exe。

如果輸入 A.exe && B.exe,結(jié)果如下,這是因?yàn)?A.exe 運(yùn)行結(jié)束后正常返回 0 給操作系統(tǒng),所以就會(huì)往下執(zhí)行 B.exe

命令行

以下面的代碼為例

test.h:

#ifndef _TEST_H_
 
#define _TEST_H_
 
#include <stdio.h>
 
class Test
{
 
public:
 
    Test(const char* s)
    {
        printf("%s\n", s);
    }
};
 
#endif

test.cpp:

#include "test.h"
 
Test t4("t4");
 
int main()
 
{
    Test t5("t5");
}

t1.cpp:

#include "test.h"
 
Test t1("t1");

t2.cpp:

#include "test.h"
 
Test t2("t2");

t3.cpp:

#include "test.h"
 
Test t3("t3");

第一步,打開 VS2012,選擇 工具 -> Visual Studio 命令提示

第二步,實(shí)用 cd/d 進(jìn)入需要編譯的文件夾。(注意換盤符需要輸入/d)

我想要編譯的文件在C:\Users\HuZeQiu\Desktop\demo 文件夾里。

輸入cd/d C:\Users\HuZeQiu\Desktop\demo,按下回車鍵,如下,就轉(zhuǎn)到了目的文件夾

第三步,輸入 cltest.cpp t2.cpp t1.cpp t3.cpp -otest.exe 編譯程序。(cl 命令是用來(lái)編譯程序)按下回車鍵后開始編譯,生成 test.exe 可執(zhí)行文件,如下:

第四步,運(yùn)行 test.exe,直接輸入 test.exe 即可,就可以看到運(yùn)行結(jié)果

編譯后的文件夾如下:

三、main 函數(shù)的參數(shù)

程序執(zhí)行時(shí)可以向 main 函數(shù)傳遞參數(shù)

gcc 編譯器的常見(jiàn)用法:

下面看一個(gè) main 函數(shù)的參數(shù)示例:

#include <stdio.h>
 
int main(int argc, char* argv[], char* env[])
{
    int i = 0;
    
    printf("============== Begin argv ==============\n");
    
    for(i=0; i<argc; i++)
    {
        printf("%s\n", argv[i]);
    }
    
    printf("============== End argv ==============\n");
    
    printf("\n");
    printf("\n");
    printf("\n");
    
    printf("============== Begin env ==============\n");
    
    for(i=0; env[i]!=NULL; i++)
    {
        printf("%s\n", env[i]);
    }
    
    printf("============== End env ==============\n");
 
    return 0;
}
 

輸出結(jié)果如下:

delphi@delphi-vm:~$ gcc test.c

delphi@delphi-vm:~$ ./a.out a.c b.c c.c ============== Begin argv ============== ./a.out a.c b.c c.c ============== End argv ==============

============== Begin env ==============

ORBIT_SOCKETDIR=/tmp/orbit-delphi SSH_AGENT_PID=1781 TERM=xterm SHELL=/bin/bash XDG_SESSION_COOKIE=6c560f89cd4609726ff940b800000007-1648713669.66817-1997070498 WINDOWID=71303204 QTDIR=/usr/local/Trolltech GNOME_KEYRING_CONTROL=/tmp/keyring-ZV2hRj GTK_MODULES=canberra-gtk-module USER=delphi LD_LIBRARY_PATH=/usr/local/Trolltech/Qt-4.7.4/lib:/usr/local/Trolltech/qtcreator-2.4.1/lib: LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36: SSH_AUTH_SOCK=/tmp/keyring-ZV2hRj/ssh DEFAULTS_PATH=/usr/share/gconf/gnome.default.path SESSION_MANAGER=local/delphi-vm:@/tmp/.ICE-unix/1750,unix/delphi-vm:/tmp/.ICE-unix/1750 USERNAME=delphi XDG_CONFIG_DIRS=/etc/xdg/xdg-gnome:/etc/xdg DESKTOP_SESSION=gnome PATH=/usr/local/Trolltech/Qt-4.7.4/bin:/usr/local/Trolltech/qtcreator-2.4.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games QT_IM_MODULE=xim PWD=/home/delphi XMODIFIERS=@im=ibus GDM_KEYBOARD_LAYOUT=cn LANG=zh_CN.utf8 GNOME_KEYRING_PID=1731 MANDATORY_PATH=/usr/share/gconf/gnome.mandatory.path GDM_LANG=zh_CN.utf8 GDMSESSION=gnome SHLVL=1 HOME=/home/delphi LANGUAGE=zh_CN:zh GNOME_DESKTOP_SESSION_ID=this-is-deprecated LOGNAME=delphi XDG_DATA_DIRS=/usr/share/gnome:/usr/local/share/:/usr/share/ DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-k3N1W1OvOx,guid=5f504019e47302c3a7df0e2000000017 LESSOPEN=| /usr/bin/lesspipe %s WINDOWPATH=7 DISPLAY=:0.0 GTK_IM_MODULE=ibus LESSCLOSE=/usr/bin/lesspipe %s %s XAUTHORITY=/var/run/gdm/auth-for-delphi-omqXhW/database COLORTERM=gnome-terminal _=./a.out ============== End env ==============  

四、main 函數(shù)一定是程序執(zhí)行的第一個(gè)函數(shù)嗎

下面看一個(gè)示例:

#include <stdio.h>
 
#ifndef __GNUC__
#define __attribute__(x) 
#endif
 
__attribute__((constructor))
void before_main()
{
    printf("%s\n",__FUNCTION__);
}
 
__attribute__((destructor)) 
void after_main()
{
    printf("%s\n",__FUNCTION__);
}
 
int main()
{
    printf("%s\n",__FUNCTION__);
    
    return 0;
}

輸出結(jié)果如下:

constructor 告訴編譯器在 main 函數(shù)之前先調(diào)用,destructor 告訴編譯器在 main 函數(shù)之后調(diào)用。

如果在 windows 下的 VS2012 命令行窗口運(yùn)行

#include <stdio.h>
 
#ifndef __GNUC__
#define __attribute__(x) 
#endif
 
__attribute__((constructor))
void before_main()
{
    printf("%s\n", "before_main");
}
 
__attribute__((destructor)) 
void after_main()
{
    printf("%s\n", "after_main");
}
 
int main()
{
    printf("%s\n", "main");
    
    return 0;
}

輸出結(jié)果如下:

所以再來(lái)看這個(gè)問(wèn)題:main 函數(shù)一定是程序執(zhí)行的第一個(gè)函數(shù)嗎?

回答如下:不一定。假設(shè)使用 gcc 編譯器中的屬性關(guān)鍵字,就可以指定 main 函數(shù)之前可以執(zhí)行一個(gè)函數(shù),在 main 函數(shù)之后執(zhí)行一個(gè)函數(shù);對(duì)于沒(méi)有擴(kuò)展屬性關(guān)鍵字的編譯器而言,main 函數(shù)一定是第一個(gè)函數(shù)。

五、小結(jié)

  • 一個(gè) C 程序是從 main 函數(shù)開始執(zhí)行的
  • main 函數(shù)是操作系統(tǒng)調(diào)用的函數(shù)
  • main 函數(shù)有參數(shù)和返回值
  • 現(xiàn)代編譯器支持在 main 函數(shù)前調(diào)用其它函數(shù)

到此這篇關(guān)于C語(yǔ)言中main函數(shù)與命令行參數(shù)詳細(xì)講解的文章就介紹到這了,更多相關(guān)C語(yǔ)言 main函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言 位段的詳細(xì)介紹

    C語(yǔ)言 位段的詳細(xì)介紹

    這篇文章主要介紹了C語(yǔ)言 位段的詳細(xì)介紹的相關(guān)資料,學(xué)習(xí)C語(yǔ)言基礎(chǔ)的朋友,可以參考本文,需要的朋友可以參考下
    2016-11-11
  • C語(yǔ)言深入探究自定義類型之結(jié)構(gòu)體與枚舉及聯(lián)合

    C語(yǔ)言深入探究自定義類型之結(jié)構(gòu)體與枚舉及聯(lián)合

    今天我們來(lái)學(xué)習(xí)一下自定義類型,自定義類型包括結(jié)構(gòu)體、枚舉、聯(lián)合體,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考
    2022-05-05
  • C++用mysql自帶的頭文件連接數(shù)據(jù)庫(kù)

    C++用mysql自帶的頭文件連接數(shù)據(jù)庫(kù)

    現(xiàn)在正做一個(gè)接口,通過(guò)不同的連接字符串操作不同的數(shù)據(jù)庫(kù)。要用到mysql數(shù)據(jù)庫(kù)。通過(guò)網(wǎng)上的一些資料和自己的摸索,大致清楚了C++連接mysql的方法??梢酝ㄟ^(guò)2種方法實(shí)現(xiàn)。第一種方法是利用ADO連接,第二種方法是利用mysql自己的api函數(shù)進(jìn)行連接。今天主要來(lái)講解下使用API
    2016-07-07
  • 使用C語(yǔ)言實(shí)現(xiàn)本地socke通訊的方法

    使用C語(yǔ)言實(shí)現(xiàn)本地socke通訊的方法

    這篇文章主要介紹了?使用C語(yǔ)言實(shí)現(xiàn)本地socke通訊,代碼分為服務(wù)器代碼和客戶端代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • C++利用容器查找重復(fù)列功能實(shí)現(xiàn)

    C++利用容器查找重復(fù)列功能實(shí)現(xiàn)

    本文將詳細(xì)介紹c++容器簡(jiǎn)介,c++容器的比較 與操作實(shí)例,需要了解更多的朋友可以參考下
    2012-11-11
  • 淺談C++中thread庫(kù)join和detach的區(qū)別

    淺談C++中thread庫(kù)join和detach的區(qū)別

    這篇文章主要為大家介紹了C++中thread庫(kù)join和detach的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • C語(yǔ)言魔塔游戲的實(shí)現(xiàn)代碼

    C語(yǔ)言魔塔游戲的實(shí)現(xiàn)代碼

    這篇文章主要介紹了C語(yǔ)言魔塔游戲的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C++類模板與函數(shù)模板基礎(chǔ)詳細(xì)講解

    C++類模板與函數(shù)模板基礎(chǔ)詳細(xì)講解

    C++語(yǔ)言的模板技術(shù)包括函數(shù)模板和類模板,模板技術(shù)是一種代碼重用技術(shù),函數(shù)和類是C++語(yǔ)言中兩種主要的重用代碼形式,這篇文章主要介紹了C++函數(shù)模板和類模板,需要的朋友可以參考下
    2022-08-08
  • C++的四種類型轉(zhuǎn)換

    C++的四種類型轉(zhuǎn)換

    這篇文章主要介紹了C++的四種類型轉(zhuǎn)換,有詳細(xì)的示例代碼展示,對(duì)于學(xué)習(xí)C++的同學(xué)有一定的參考價(jià)值,感興趣的同學(xué)可以參考本文
    2023-04-04
  • C++深入分析數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形態(tài)

    C++深入分析數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形態(tài)

    使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么
    2023-01-01

最新評(píng)論