C語言 在命令列編譯執行程式

2021-09-06 20:16:30 字數 3266 閱讀 3310

【開始】

1. 在mac和linux上寫c語言之前,首先要看看是否安裝了編譯器:

在終端下輸入gcc後回車進行檢測,如果安裝過,將提示 clang: error: no input files(沒有輸入檔案);

在centos下直接yum -y install gcc gcc-c++(-y表示將自動選擇y)

2. 現在開始愉快的寫**:

在xcode裡對新建的專案檔案使用command+r就直接編譯執行你的c**了。

在mac終端下,使用神器vim,如:vim test.c ,它不會幫你新建test.c,寫完c**後你需要command+s儲存,然後:wq!退出,使用命令gcc test.c編譯,不指定編譯後的檔名,編譯檔名都將是a.out ,執行它使用./a.out

在linux下,同樣使用vim,輸入vim test.c 的時候就在當前目錄新建了test.c檔案,寫完c**直接:wq!儲存退出,使用gcc test.c編譯,執行編譯檔案./a.out   ( gcc -o main.c main.o #生成.o檔案 )

sublime text是一款值得使用的文字編輯器,如果裝好環境,使用cmd+b對**進行編譯,shift+cmd+b執行,但是sublime只能執行乙個程式,如果需要執行有輸入的程式,就必須離開sublime進入到終端。

3. demo:

#include "

stdio.h"/*

標準輸入流:鍵盤輸入

標準輸出流:終端輸出

標準錯誤流:錯誤輸出

stdin

stdout

stderr

*/int

main()

else

return

0;

}

重定向:

./main.out >>m.txt     #執行檔案輸出結果追加寫入到m.txt

./main.out >m.txt     #執行檔案輸出結果覆蓋寫入到m.txt

./main.out

./main.out

1>t.txt 2>f.txt < input.txt  #輸出流寫入t.txt, 錯誤流寫入f.txt, 輸入流使用input.txt

管道:

ls /usr/local/ | grep

binps -e | grep

ssh    #將前一條命令的輸出流作為後面命令的輸入流

附:【c語言編譯過程】

假如要編譯乙個 1.c 程式為可執行檔案 build,如何看到編譯器的處理過程呢,使用 gcc -v -o build 1.c

1. 預處理

cpp -o 1.i 1.c  # 翻譯成.i檔案

gcc -e

2. 編譯,系統用的是cc1

/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -o build 1.c

我們可以直接用gcc -s, 相當於幫我們執行上面的過程;

3. 彙編,系統用的是as

as -o build 1.c

我們可以直接用gcc -c,因為系統沒有辦法直接把c程式轉為彙編,所以相當於依次執行了編譯和彙編;

4. 鏈結,系統用的是collect2

/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 -o build 1.c

我們可以直接用gcc -o,同理,系統幫我們依次執行了編譯、彙編、鏈結。

示例:gcc -e -o 1.i 1.c  # 生成預處理檔案1.i,將其中的include和define等替換成其它

gcc -s -o 1.s 1.c  # 編譯成1.s 彙編碼檔案,-o選項不能省,只是增加了-s選項

gcc -c -o 1.o 1.c  # 編譯成1.o 二進位製碼檔案,給機器讀

由於include和define是預處理階段完成的替換,所以它們並不是關鍵字,關鍵字是編譯器處理的。

( 條件預處理 )

gcc -dabc  相當於 #define abc , 用於除錯中。

示例:

include int

main()

編譯時,gcc -dabc -o build 1.c ,-d選項後面直接加常量名,預處理會加入巨集定義。

不用命令列定義 array_size 時,值為3:

#include int

main()

; printf(

"array_size is %d\n

", array_size);

perror(

"error msg");

return0;

}

gcc -o build 1.c -darray_size=2

( 巨集展開下的#, ## )

#  字串化

##  連線符號

#define abc(x) #x      // 巨集體相當於字串x,在巨集中想賦值字串的時候使用

#define abc(x) day##x   // 巨集體相當於day連線x後的內容

示例:

include #define func(x) #x

#define par(x) myparam##x

intmain()

例2:核心中用例,傳入不同的字尾可以得到不同的值

#define adm8211_sram(x) (priv->pdev->revision < adm8211_rev_db ? \adm8211_sram_a_ ## x : adm8211_sram_b_ ## x)

#define adm8211_sram_indiv_key   0x0000

#define adm8211_sram_a_share_key  0x0160

#define adm8211_sram_b_share_key  0x00c0

#define adm8211_sram_a_ssid     0x0180

#define adm8211_sram_b_ssid     0x00d4

linux 下我們用man可以看到完整的手冊,如果想看一些常用選項,建議你用 `gcc --help`:

C 呼叫命令列程式

using system using system.collections.generic using system.linq using system.text using system.diagnostics 執行cmd命令 會顯示命令視窗 指定應用程式的完整路徑 執行命令列引數 static ...

如何debug命令列程式 C

常用的2種方法 方法1在main 函式剛開始,加入如下 1 static int main string args 2 這樣能讓程式在此停住,等待輸入。此時便可以在vs中attach上該程式,開始debug。此方法在需要debug各種引數時比較方便。方法2直接在vs中開啟project proper...

在程式裡呼叫命令列程式

在程式裡呼叫命令列程式,一位cnblog的仁兄寫的 process早就有辦法了,只不過我沒有注意.如呼叫乙個命令列 cmd c dir c winnt 把結果放到乙個字串裡.processstartinfo psi new processstartinfo cmd c dir c winnt psi...