C語言預處理彙編過程

2021-08-14 13:38:42 字數 2551 閱讀 4602

命令列定義

條件編譯

檔案包含

多個原始檔分別進行編譯生成目標檔案(.obj)—->由聯結器和鏈結庫進行鏈結—–>形成可執行檔案

預處理選項 gcc -e test.c -o test.i

預處理 完成之後就停下來,預處理 之後產 生的結果都放在test.i 檔案中。

所做的事情包括標頭檔案的包含,define定義符號替換,注釋刪除

編譯 選項 gcc -s test.i

生成彙編**放在 test.s 檔案,並進行語法分析,詞法分析,語義分析,符號彙總。

彙編 gcc -c test.s

彙編完成之後就停下來,結果儲存在test.o中,彙編**轉換成二進位制指令。

test.o 在linux下是elf檔案,在windows下是pe

nm test.o 檢視符號表

進行的工作

合併符號表,符號重定位,查詢鏈結錯誤(能否找到對應的符號)

合併段表,elf形式儲存,相對應的段進行合併

__file__ // 進行編譯的原始檔,使用%s輸出

__line__ // 檔案當前的行號

___date___ // 檔案被編譯的日期_

__time__ // 檔案被編譯的時間

___stdc___ // 如果編譯器器遵循 ansi c ,其值為 1 ,否則未定

可以定義符號和巨集,區別就是巨集有引數替換

因為定義巨集很容易出現優先順序錯誤,所以不要吝嗇()來確定優先順序

#define max 1000           //符號

#define print(num) printf("%d",num) //巨集

print(a);

#define double(x) (x) +(x)

printf("%d",10*double(2+3)) //55

#define double(x) ((x) + (x)) //這樣定義就不會錯了

#define print(x,format) printf("the value of " #x "is" format,x)

print(a,10);

#define cat(x,y) x##y

int hello1 = 100;

print("%d",cat(hello,1)); //100

#將引數解析為字串,不進行替換

##拼接引數成為乙個字串

#undef max //乙個名字需要重新定義,先移除

巨集的優勢

用於呼叫函式和從函式返回的**可能比實際執行這個小型計算工作所需要的時間更多。所以巨集比函式在程式的規模和速度方面更勝一籌』

更為重要的是函式的引數必須宣告為特定的型別。所以函式只能在型別合適的表示式上使用。反之這個巨集怎可以適用於整形、長整型、浮點型等可以用於》來比較的型別。巨集是型別無關的

劣勢

每次使用巨集的時候,乙份巨集定義的**將插入到程式中。除非巨集比較短,否則可能大幅度增 加程式的長度。

巨集是沒法除錯的。

巨集由於型別無關,也就不夠嚴謹。

巨集可能會帶來運算子優先順序的問題,導致程容易出現錯,並且有***(++)

使用場景:在不同的機器上執行相同的程式,可能由於記憶體限制需要定義不同大小的陣列

gcc -darray_size

=10 programe.c //-d 選項,能替換**中的同名引數

#define __debug__

#ifdef __debug__

printf("測試");

#endif

#if defined(symbol) //同上,判斷是否定義,即使symbol是0

#ifdef symbol

有時候在測試**中有多處測試需要注釋掉,而條件編譯能把它們一次全部注釋掉。

條件編譯後面還可以跟表示式,分支條件編譯,巢狀條件編譯,若滿足條件,則在預編譯時將**呈現,否則刪除。

#include //直接去標準位置找,速度快(linux: /usr/include)

#include "add.h" //先去本地找標頭檔案,再去庫里找

防止標頭檔案被多次引入,使用條件編譯

#ifndef __game_h__

#define __game_h__

#endif __game_h__

#pragma once

C語言的預處理 編譯 彙編 鏈結

一 預處理 預處理指令的執行主要包含下列事情 1.標頭檔案的包含 2.注釋的刪除 3.巨集定義的替換 4.條件編譯的選擇 指令 gcc e test.c o test.i 呼叫的是預處理器cpp,e 只進行預處理操作,o 輸出到 檔案 i表示產生的臨時檔案 intermediate 二 編譯 編譯之...

C語言預處理

c語言中編譯預處理的三種形式的命令 巨集定義,檔案包含,條件編譯命令。1 巨集定義主要是 define,undef 如下 define pi 3.1415926 不帶引數的巨集定義 define max a,b a b?a b 帶引數的巨集定義 說明 巨集定義在c語言與c 語言中是相通的。下面舉例說...

C語言預處理

預處理 系統自動自動呼叫預處理程式對程式中 號開頭的預處理部分進行處理,處理完畢後可以進城源程式的編譯階段。預定義 一些預定義符號 常用於除錯 file 正在預編譯的源檔名 line 當前行號 只有這個是整數常量,其他是字串常量 function 當前所在函式名 date 當前日期 time 當前時...