艾瑪拉文翻譯

轉換化簡程序:

  • 先取一個合適的截斷點
  • 將截斷點以後的低優先權運算以 typedef 定義為別名
  • 然後用別號界說或宣佈截斷點之前的高優先權運算.

// 下行的語法是毛病: static 不行以出現在 typedef 中
typedef static int newINT;
newINT x, y, x;

// 要改成以下二行才行 (static 必須移到變數界說式)
typedef int newINT;
static newINT x, y翻譯社 z;
  • 別的二個限制詞 (qualifier, constvolatile) 則沒有上述的限制: 可以呈現在新資料型態的 typedef 界說中; 也能夠不呈現在新資料型態的 typedef 界說中翻譯社 而改在變數界說或宣佈時加上限制. 固然, 我們不成以兩者都加. 同時, 要當心變數界說或宣告內容包括有指標的環境, 此時 keyword constvolatile 的限制標的釀成有二個: 一個是指標自己另外一個是指標所指向的資料. 這個時辰到底誰被 keyword 限制翻譯社 取決於 keyword 泛起的位置.
    • 下面的式子(1), 式子(2)和式子(3)寫法相通, 是界說一個指標變數指向常數資料 (指標值可變翻譯社 資料值不行變).
    • 式子(4)和式子(5)寫法相通, 是定義一個常數指標指向可更動的資料 (指標值不可變, 資料值可變).
    • 式子(1)的寫法經常會被誤以為應當和式子(5)相等, 所以就錯誤的把勢子(1)化簡為式子(5). 但實際上是式子(1)應當以化簡為式子(3). (我們應當把式子(5) const ptr p 中的 ptr 算作和 const int x 中的 int 一樣, 是一個資料型態. 而不要把它以 typedef 的定義 char * 來替換.)
    // define a non-const pointer to const data
    const char * p; // (1)
    char const * p; // (2)
    typedef const char * ptr; // (3-1)
    ptr p; // (3-2)
    
    // define a const pointer to non-const data
    char * const p; // (4)
    typedef char* ptr; // (5-1)
    const ptr p; // (5-2)
    
    • 備註:
      • 式子(4)和式子(5-2)在現實應用中是不 OK 的, 因為 (指標變數的) 變數值自己是一常數, 必須在定義變數的同時指定其常數值. 現實應用的例子如下: 式子(4a)是指定某一個變數的位址; 式子(4b)是指定一特定位址.
        char * const p = &x; // (4a)
        char * const p = 0x200000; // (4b)
        
      • 不外式子(4b)的用法會多華侈一個指標變數的空間 (即變數 p 自己). 這是因為 0x200000 自己就是一個 const, 所以沒需要用變數來貯存它然後又宣佈說該變數是常數不成以更動. 其實我們可以直接用 type casting 的方式把 0x200000 轉型就能夠了翻譯社((char *)0x200000). 假如覺得後續利用它的程式敘述會不好讀翻譯社 那可以插足 #define CONST_P ((char *)0x200000) 這樣的置換巨集, 然後把程式敘述改成使用 CONST_P 來代替 ((char *)0x200000) 便可.
      • 式子(1), 式子(2)和式子(3)在實際應用中是 OK 的翻譯社 同時它只是限制不可以經由指標變數 p 來改變其所指到的變數, 而不是限制所指到的變數必須是常數.
        typedef const char * ptr;
        
        ptr p;
        char x = 0x20;
        
        p = &x;
        *p = 0x21; // Compiler will alert.
        x = 0x21; // OK
        

    最常看到的毛病典範是我們想要寫一個像 strcmp() 那樣的函數, 於是宣佈了以下的函數原型 mystrcmp(const char *翻譯社 const char *)翻譯社 然後為了想簡化於是又增添了界說 typedef char * pstr; 接著把函數原型宣佈改成 mystrcmp(const pstr, const pstr)翻譯社 然後就掛掉了... (我們但願的是字串比力時不要去動到字串的內容, 而不是指標值不克不及更動)

    unsigned char flag1, flag2;
    struct _list_node_ {
     unsigned long size;
     strcut _list_node_ *next;
    } node0, *free_list;
    

    再來看的是改用 typedef 後的模樣:

    typedef uint8_t Buffer[16];
    
    Buffer xBuf;
    
    xBuf[0] = 3;
    xBuf[1] = 2;