define typedef用法
#define
只能通過簡單的文本替換來實現而非傳遞參數;
#define MUL1(x) x * x
#define MUL2(x) (x) * (x)
MUL1(3) // 9
MUL1(3+2) // 3+2*3+2 = 11
MUL2(3) // 9
MUL2(3+2) // (3+2)*(3+2) = 25
例題
#define SUB(x,y) x-y
#define ACCESS_BEFORE(element,offset,value) *(SUB(&element, offset)) = value
void main_5()
{
int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int i;
ACCESS_BEFORE(array[5], 4, 99);// *SUB(&array[5], 4) = 99
// * (&array[5] - 4) = 99
printf("array: ");
for (i = 0; i < 10; ++i) {
printf("%d", array[i]);
}
printf("\n");
輸出:19934567890
typedef
用法1:爲基本數據類型定義新的類型名
typedef unsigned int uint8_t;
typedef char* p_CHAR;
uint8_t time;
p_CHAR pa, pb; // 定義兩個char型指針,不同於char *pa, pb
用法2:爲自定義數據類型定義新的名稱
//
struct point{
int x;
int y;
};
typedef struct point Point;
//
typedef struct area{
int weight;
int hight;
}Area, *p_area; // 此處:Area* p_area
//
typedef struct {
string name;
int age;
}Person;
struct point my_point1 = {4, 5};
Point my_point2 = {6,7};
Area my_area1 = {2, 6};
Person my_person1 = {"mr-xuf", 24};
cout << "my_point1 x = " << my_point1.x << ", my_point1 y = " << my_point1.y <<endl;
cout << "my_point2 x = " << my_point2.x << ", my_point2 y = " << my_point2.y <<endl;
cout << "my_area1 weight = " << my_area1.weight << ", my_area1 hight = " << my_area1.hight <<endl;
cout << "my_person1 name = " << my_person1.name << ", my_person1 age = " << my_person1.age <<endl;
用法3:掩飾複合類型 即定義數組類型/數字組指針類型
定義數組類型
typedef int arr_t[5];///定義了一個數組類型arr_t,該類型的變量是個數組
int main(void)
{
arr_t d; //d是個數組,這一行等價於: int d[5];
arr_t b1, b2, b3;//b1, b2, b3都是 包含5個元素的數組
d[0] = 1;
d[1] = 2;
d[4] = 134;
d[5] = 253;//編譯警告:下標越界
}
定義數組指針類型
typedef int(*pArr_t)[5];//定義一個指針類型,該類型的指針可以指向含5個int元素的一維數組
int main(void)
{
int a[5] = {1,2,3,4,5};
int b[7] = {1,2,3,4,5,6,7};
pArr_t pA;//定義數組指針變量pA
pA= &a;//完全合法,無警告
pA= (pArr_t)&b;//類型強制轉換爲pArr_t,完全合法,無警告
}
用法4:掩飾複合類型 即定義函數類型/函數指針類型
定義函數類型
typedef int (my_f)(int, int);
int add(int a, int b){
cout << "add function...." << a + b << endl;
return a + b;
}
my_f *pp = add;
pp(7, 8);
定義函數指針類型
typedef int(*my_func)(int , int );// 聲明指針my_func 指向int(*)(int, int)
int add(int a, int b){
cout << "add function...." << a + b << endl;
return a + b;
}
add(1, 3);// 直接調用
my_func my_func_add = add;
my_func_add(5, 6);
int (*p)(int , int);// 定義變量p 指向一個xxxx函數
p = &add;
p(1, 5);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.