Way on c & c++ 小記 [四]
關於自增運算符的進一步研究。
代碼:
#include<stdio.h> int main(int argc,char*argv[]){ int a,b; a = b = 0; b = ++a; b = a++; b++; a = a++; return 0; }
反匯編後:
b = ++a; 00000039 inc dword ptr [ebp-0Ch] 0000003c mov eax,dword ptr [ebp-0Ch] 0000003f mov dword ptr [ebp-10h],eax b = a++; 00000042 mov eax,dword ptr [ebp-0Ch] 00000045 mov dword ptr [ebp-10h],eax 00000048 inc dword ptr [ebp-0Ch] b++; 0000004b inc dword ptr [ebp-10h] a = a++; 0000004e nop 0000004f inc dword ptr [ebp-0Ch]
2010-1-30 晚
----------------------------------------cuttingline----------------------------------------
C中預處理與typedef概覽。
【目錄】
1.宏定義
2.文件包含
3.條件編譯
4. typedef
一、宏定義
預處理命令,包括文件包含和條件編譯,都是在預編譯時進行處理的;因為編譯器無法識別預處理命令,所以在編譯前,預處理命令已經處理完畢。預處理命令是ANSI C統一規定的,但是並不是C語言本身的組成,所以純粹的C編譯器是無法識別它們的。
個人總結宏定義有3個用途:
I 簡單的宏定義:#define A B
這個比較簡單,就是純粹的完全的替換
II 帶參數的宏定義:#define A(a,b) a+b
這點有點類似函數處理,不過函數是在運行時進行調用,而宏定義在編譯時便進行替換。前者時間花費在運行上的現場保護等,後者花費在預處理命令上的處理。
例子:
#include <stdio.h>
#define Add(a,b) a+b
int main(){
int c;
c = Add(2,3);
printf(“%d/n”,c);
return 0;
}
這一段代碼輸出5並進行換行。
III 得到多個結果的宏
有時候調用函數想返回多個值得使用數組或者指針,使用宏有時候可以簡單地“返回”多個值。
例子:
#include <stdio.h>
#define LenAndArea(l,s,a,b)l=(a+b)*2;s=a*b;
int main(){
int len,area;
LenAndArea(len,area,2,3);
printf(“%d/n%d/n”,len,area);
return 0;
}
這一段輸出10換行6換行
二、文件包含
寫C語言第一句一般都是#include<stdio.h>,所以一般久而久之就以為這是C語言的一部分了;然而很驚人的,嚴格來說這不是C語言本身的組成部分。
文件包含有兩種形式,一種是#include“stdio.h”,表示要包含的文件從當前目錄下搜索,而#include <stdio.h>則表示從存放C庫函數頭文件的目錄搜索,為標準方式。
文件包含在編譯預處理時形成一個新的源文件,即將目標文件全部包含進來再進行編譯,形成.obj文件,再進行連接。
三、條件編譯
條件編譯給我的第一印象是類似於ThinkPHP的配置文件中設置了‘DEBUG_MODE’ => TRUE,為什麼呢?因為學習條件編譯的時候看到的就是用來控製進行跟蹤的輸出。
例子:
#include <stdio.h>
#define DEBUG
int main(){
#ifdef DEBUG
printf(“開啟了跟蹤/n”);
#endif
return 0;
}
當源文件中有多個跟蹤輸出的時候這樣使用方便許多。此外,在避免重複包含頭文件時也如此處理。
條件編譯格式:
#ifdef A
codehere…
#else
code
#endif
其中#else部分可以省略,隻要前文中有#defineA語句,甚至不需要對A進行具體定義標識,便會執行相應代碼部分。
類似的有#ifndef。
條件編譯與if語句不同,條件編譯是在編譯階段選擇是否進行編譯,而if語句是程序運行階段的控製語句。
最後還有一種條件編譯,它根據表達式的值是否為真判斷是否進行編譯:
#if A
code1
#else
code2
#endif
如果A為真則編譯code1,否則編譯code2。
四、Typedef
typedef不是預處理命令,它是在編譯時進行處理的。
使用typedef可以利於程序的通用性和可移植性。有的機器上int類型占用2個字節,而有的機器上int類型占用4個字節,此時的int就相當於long類型的數值範圍。為了便於移植,可以使用:
typedef int INT
typedef long INT
此外,使用typedef定義數組如下:
#include <stdio.h>
typedef int INTARR[10];
int main(){
INTARRa={1,2};
printf(“%d/n%d/n”,a[0],a[1]);
return0;
}
2010-2-4 午
----------------------------------------cuttingline----------------------------------------
最後更新:2017-04-02 04:01:46