cpp編譯預處理程序
① 在計算機上運行一個c語言編寫的程序,要經過怎樣的處理過程
開發一個C語言程序需要經過的四個步驟:編輯、編譯、連接、運行。
C語言程序可以使用在任意架構的處理器上,只要那種架構的處理器具有對應的C語言編譯器和庫,然後將C源代碼編譯、連接成目標二進制文件之後即可運行。
1、編輯:輸入源程序並保存(。C文件)。
2、編譯:將源程序翻譯成目標文件(。OBJ文件)。
3、連接:將目標文件轉換成可執行文件。EXE文件)。
4、運行:執行。EXE文件,得到運行結果。
(1)cpp編譯預處理程序擴展閱讀:
C代碼變成程序的階段:
1、首先,源代碼文件test。c和相關的頭文件,如stdio。h,由預處理程序CPP預處理為一個。我的文件。這是預編譯。I文件不包含任何宏定義,因為所有宏都已展開,所包含的文件都已插入其中。我的文件。
2、編譯過程就是對預處理後的文件進行一系列的詞法分析、語法分析、語義分析和優化,從而產生相應的匯編代碼文件。這個過程通常是整個程序構造的核心部分,也是最復雜的部分之一。
3、匯編程序不直接輸出可執行文件,而是輸出目標文件。匯編程序可以調用LD來生成一個可以運行的可執行程序。為了得到最終的可執行文件「A.out」,需要將一大堆文件鏈接在一起。
4、在鏈接過程中,調用其他目標文件中定義的函數的指令需要重新校準,使用其他目標文件中定義的變數的指令也需要重新校準。
② 編程完之後是怎樣把那些文件(.cpp .h.....)整合成一個可安裝的安裝的呢
如果你是用gcc編譯:
gcc最基本的用法是∶gcc [options] [filenames]
其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。
-c,只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為後綴的目標文件,通常用於編譯不包含主程序的子程序文件。
-o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。
-g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。
-O,對程序進行優化編譯、連接,採用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。
-O2,比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢。
-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。C程序中的頭文件包含兩種情況∶
A)#include <myinc.h>
B)#include 「myinc.h」
其中,A類使用尖括弧(< >),B類使用雙引號(「 」)。對於A類,預處理程序cpp在系統預設包含文件目錄(如/usr/include)中搜尋相應的文件,而B類,預處理程序在目標文件的文件夾內搜索相應文件。
最簡單的:
終端里輸入gcc helloworld.c -o helloworld
helloworld就是生產的可執行程序,然後執行./helloworld就可以打開了
③ 編譯程序的各階段都涉及到什麼
預處理,詞法分析,文法分析,生成中間代碼,生成目標代碼。
1、預處理:導入源程序並保存(C文件)。
2、編譯:將源程序轉換為目標文件(Obj文件)。
3、鏈接:將目標文件生成為可執行文件(EXE文件)。
(3)cpp編譯預處理程序擴展閱讀:
將C語言代碼分為程序的幾個階段:
首先,源代碼文件測試。以及相關的頭文件,比如stdio。H、由預處理器CPP預處理為.I文件。預編譯的。
編譯過程是對預處理文件進行詞法分析、語法分析、語義分析和優化,生成相應的匯編代碼文件。這個過程往往是整個程序的核心部分。
④ C預處理程序cpp是什麼
cpp是C++程序的拓展名
⑤ C語言編譯執行的全過程是怎樣的
不明白樓主什麼意思,就是先把你的代碼轉為匯編代碼,然後轉為二進制文件,讀入內存執行。
⑥ C++預處理的C++預處理指令
一、預處理的由來:
在C++的歷史發展中,有很多的語言特徵(特別是語言的晦澀之處)來自於C語言,預
處理就是其中的一個。C++從C語言那裡把C語言預處理器繼承過來(C語言預處理器,被Bj
arne博士簡稱為Cpp,不知道是不是C Program Preprocessor的簡稱)。
二、常見的預處理功能:
預處理器的主要作用就是把通過預處理的內建功能對一個資源進行等價替換,最常見
的預處理有:文件包含,條件編譯、布局控制和宏替換4種。
文件包含:#include 是一種最為常見的預處理,主要是做為文件的引用組合源程序正
文。
條件編譯:#if,#ifndef,#ifdef,#endif,#undef等也是比較常見的預處理,主要是進
行編譯時進行有選擇的挑選,注釋掉一些指定的代碼,以達到版本控制、防止對文件重復
包含的功能。
布局控制:#progma,這也是我們應用預處理的一個重要方面,主要功能是為編譯程序
提供非常規的控制流信息。
宏替換: #define,這是最常見的用法,它可以定義符號常量、函數功能、重新命名
、字元串的拼接等各種功能。
三、預處理指令:
預處理指令的格式如下:
# directive tokens
#符號應該是這一行的第一個非空字元,一般我們把它放在起始位置。如果指令一行放
不下,可以通過進行控制,例如:
#define Error if(error) exit(1) 等價於
#define Error
if(error) exit(1)
不過我們為了美化起見,一般都不怎麼這么用,更常見的方式如下:
# ifdef __BORLANDC__
if_true<(is_convertible<Value,named_template_param_base>::value)>:
:
template then<make_named_arg, make_key_value>::type Make;
# else
enum { is_named = is_named_parameter<Value>::value };
typedef typename if_true<(is_named)>::template
then<make_named_arg, make_key_value>::type Make;
# endif
下面我們看一下常見的預處理指令:
#define 宏定義
#undef 未定義宏
#include 文本包含
#ifdef 如果宏被定義就進行編譯
#ifndef 如果宏未被定義就進行編譯
#endif 結束編譯塊的控制
#if 表達式非零就對代碼進行編譯
#else 作為其他預處理的剩餘選項進行編譯
#elif 這是一種#else和#if的組合選項
#line 改變當前的行數和文件名稱
#error 輸出一個錯誤信息
#pragma 為編譯程序提供非常規的控制流信息
下面我們對這些預處理進行一一的說明,考慮到宏的重要性和繁瑣性,我們把它放到
最後講。
四、文件包含指令:
這種預處理使用方式是最為常見的,平時我們編寫程序都會用到,最常見的用法是:
#include <iostream> //標准庫頭文件
#include <iostream.h> //舊式的標准庫頭文件
#include IO.h //用戶自定義的頭文件
#include ../file.h //UNIX下的父目錄下的頭文件
#include /usr/local/file.h //UNIX下的完整路徑
#include ..file.h //Dos下的父目錄下的頭文件
#include usrlocalfile.h //Dos下的完整路徑
這裡面有2個地方要注意:
1、我們用<iostream>還是<iostream.h>?
我們主張使用<iostream>,而不是<iostream.h>,為什麼呢?我想你可能還記得我
曾經給出過幾點理由,這里我大致的說一下:
首先,.h格式的頭文件早在98年9月份就被標准委員會拋棄了,我們應該緊跟標准
,以適合時代的發展。
其次,iostream.h只支持窄字元集,iostream則支持窄/寬字元集。
還有,標准對iostream作了很多的改動,介面和實現都有了變化。
最後,iostream組件全部放入namespace std中,防止了名字污染。
2、<io.h>和io.h的區別?
其實他們唯一的區別就是搜索路徑不同:
對於#include <io.h> ,編譯器從標准庫路徑開始搜索
對於#include io.h ,編譯器從用戶的工作路徑開始搜索
五、編譯控制指令:
這些指令的主要目的是進行編譯時進行有選擇的挑選,注釋掉一些指定的代碼,以達
到版本控制、防止對文件重復包含的功能。
使用格式,如下:
1、
#ifdef identifier
your code
#endif
如果identifier為一個定義了的符號,your code就會被編譯,否則剔除
2、
#ifndef identifier
your code
#endif
如果identifier為一個未定義的符號,your code就會被編譯,否則剔除
3、
#if expression
your code
#endif
如果expression非零,your code就會被編譯,否則剔除
4、
#ifdef identifier
your code1
#else
your code2
#endif
如果identifier為一個定義了的符號,your code1就會被編譯,否則your code2就
會被編譯
5、
#if expressin1
your code1
#elif expression2
your code2
#else
your code3
#enif
如果epression1非零,就編譯your code1,否則,如果expression2非零,就編譯y
our code2,否則,就編譯your code3
⑦ 編譯程序預處理干什麼
編譯預處理是C語言區別於其它高級程序設計語言的特徵之一,它屬於C語言編譯系統的一部分。C程序中使用的編譯預處理命令均以#開頭,它在C編譯系統對源程序進行編譯之前,先對程序中這些命令進行「預處理」。編譯預處理命令的三種不同形式:宏定義、文件包含和條件編譯。
⑧ C語言程序運行過程
C源程序頭文件-->預編譯處理(cpp)-->編譯程序本身-->優化程序-->匯編程序-->鏈接程序–>可執行文件
1.編譯預處理
讀取c源程序,對其中的偽指令(以#開頭的指令)和特殊符號進行處理
[析] 偽指令主要包括以下四個方面
(1)宏定義指令,如#define Name TokenString,#undef等。對於前一個偽指令,預編譯所要做的是將程序中的所有Name用TokenString替換,但作為字元串常量的Name則不被替換。對於後者,則將取消對某個宏的定義,使以後該串的出現不再被替換。
(2)條件編譯指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉
(3)頭文件包含指令,如#include 「FileName」或者#include <FileName>等。在頭文件中一般用偽指令#define定義了大量的宏(最常見的是字元常量),同時包含有各種外部符號的聲明。採用頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用。因為在需要用到這些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復一遍。預編譯程序將把頭文件中的定義統統都加入到它所產生的輸出文件中,以供編譯程序對之進行處理。
包含到c源程序中的頭文件可以是系統提供的,這些頭文件一般被放在/usr/include目錄下。在程序中#include它們要使用尖括弧(<>)。另外開發人員也可以定義自己的頭文件,這些文件一般與c源程序放在同一目錄下,此時在#include中要用雙引號(」")。
(4)特殊符號,預編譯程序可以識別一些特殊的符號。例如在源程序中出現的LINE標識將被解釋為當前行號(十進制數),FILE則被解釋為當前被編譯的C源程序的名稱。預編譯程序對於在源程序中出現的這些串將用合適的值進行替換。
⑨ 如何編譯並運行C語言程序
1、創建一個文件名為main.c,然後用任意一個款你熟悉的文本編輯軟體,比如說記事本,在裡面輸入下面的代碼,記住,要用文本文件編輯軟體,不能用word的。
(9)cpp編譯預處理程序擴展閱讀:
c語言小游戲實現原理
1、二維數組實現棋盤
二維數組,用兩個for 循環,隨便輸出一個固定符號做棋盤,如 *
2、判定玩家
設計一個計步變數step, 每走一步 step++, 則玩家=step%2+1;
3、判定輸贏(重點)
設計方向數組 dircX[4] ,dircY[4],因為如果要判斷是否練成五子,只有1豎著2橫著3斜下4斜上
豎著的話就是 x-1,y不變
橫著的話就是x不變,y+1; 斜下: x+1,y+1; 斜上 x-1;y+1
這樣你就可以賦值dircX={-1,0,1,-1} dercY={0,1,1,1}
每當玩家落下一子,就全局判斷每個子的四個方向有沒有第二子,如果有,循環判斷有沒有第三子(利用 x+=dircX[1]),直到五子完成,結束。
⑩ C語言「編譯預處理命令」,是什麼意思
您好,
宏定義
c程序提供的預處理功能之一。包括帶參數的宏定義和不帶參數的宏定義。具體是指用一個指定的標志符來進行簡單的字元串替換或者進行闡述替換。形式為:
#define
標志符(參數表)
字元串
宏名
在上定義中的標志符被稱為「宏名」。
宏展開
在c程序編譯時將宏名替換成字元串的過程稱為「宏展開」。
define
是對宏的定義:如定義了一個宏m,代表100.也就在下面的程序中只要是遇到變數m,它的值就是100