c++#define和typedef的區別
在c/c++語言中,typedef常用來定義乙個識別符號及關鍵字的別名,它是語言編譯過程的一部分,但它並不實際分配記憶體空間,如下:
typedef int int; // 識別符號在前,有分號
typedef int* pint;
#define為一巨集定義語句,通常用它來定義常量(包括無參量與帶參量),也可以是識別符號關鍵字等,它本身並不在編譯過程中進行,而是在這之前(預處理過程)就已經完成了。其本質是替換的功能。
#define int int
#define pi 3.14 //無分號,因其並非嚴格意義上的語句,巨集名稱一般大寫
1.巨集定義只是簡單的字串代換(原地擴充套件),而typedef則不是原地擴充套件,它的新名字具有一定的封裝性,以致於新命名的識別符號具有更易定義變數的功能
eg: typedef (int*) pint;
#define pint2 int*
pint a,b;的效果同int *a; int *b;表示定義了兩個整型指標變數。而pint2 a,b;的效果同int *a, b;表示定義了乙個整型指標變數a和整型變數b。
typedef常用於識別符號的定義,#define常用於常量的定於(c遺傳下來的)
1.定義一種型別的別名,而不只是簡單的巨集替換。可以用作同時宣告指標型的多個物件。比如:
char* pa, pb; // 它只宣告了乙個指向字元變數的指標 和乙個字元變數;
以下則可行:
typedef char* pchar; // 一般用大寫
pchar pa, pb; // 可行,同時宣告了兩個指向字元變數的指標
2.用在舊的c**中,宣告struct新物件時,必須要帶上struct。
typedef struct student
stu;
stu p1; // 這樣就比原來的方式少寫了乙個struct,比較省事
在c++中,typedef的這種用途二不是很大,但是理解了它,對掌握以前的舊**還是有幫助的,畢竟我們在專案中有可能會遇到較早些年代遺留下來的**。
3.用typedef來定義與平台無關的型別。
比如定義乙個叫 real 的浮點型別,在目標平台一上,讓它表示最高精度的型別為:
typedef long double real;
在不支援 long double 的平台二上,改為:
typedef double real;
在連 double 都不支援的平台三上,改為:
typedef float real;
也就是說,當跨平台時,只要改下 typedef 本身就行,不用對其他原始碼做任何修改。
標準庫就廣泛使用了這個技巧,比如size_t。
另外,因為typedef是定義了一種型別的新別名,不是簡單的字串替換,所以它比巨集來得穩健(雖然用巨集有時也可以完成以上的用途)。
1.當const和typedef一起出現時,typedef不是簡單的字串替換。
#include
using namespace std;
typedef int * int;
int main()
2. typedef在語法上是乙個儲存類的關鍵字(如auto、extern、mutable、static、register等一樣),雖然它並不真正影響物件的儲存特性,如:
typedef static int int2; //不可行
編譯將失敗,會提示「指定了乙個以上的儲存類」。
C define和typedef及複雜宣告
1.定義一種型別的別名,而不只是簡單的巨集替換。可以用作同時宣告指標型的多個物件。比如 char pa,pb typedef char pchar 一般用大寫 pchar pa,pb 2.用在舊的c的 中,宣告struct新物件時,必須要帶上struct,即形式為 struct 結構名 物件名,如 ...
C define用法總結
1 define 無引數巨集定義 用法 一般形式為 define 識別符號 字串 1 表示其為預處理命令,凡是以 開頭的都是預處理命令 define 為巨集定義命令 識別符號 為所定義的巨集名 字串 可以是常數 表示式 字串等。2 除了經常用到的如 define maxnum 100 之外,還有其它...
C define巨集定義
define 巨集名 字串這裡所說的字串是一般意義上的字串行,不要和c語言中的字串等同,它不需要雙引號。include define m n n 3 n int main 在預處理時經巨集展開後該語句變為 sum 3 nn 3n 4 nn 3n 5 nn 3n 需要注意的是,在巨集定義中表示式 nn...