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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章