首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言基礎

C語言位域實戰與 typedef 類型別名機制

     編輯:C 語言基礎

位域實戰:指針操作與復合賦值

承接上文,位域本質是特殊結構體,支援指針訪問與復合位運算賦值。

完整示例

#include <stdio.h>

struct BS {
    unsigned a : 1;
    unsigned b : 3;
    unsigned c : 4;
};

int main() {
    struct BS bit = {0}, *pbit = &bit;

    // 直接賦值
    bit.a = 1;
    bit.b = 7;
    bit.c = 15;
    printf("初始: %d,%d,%d\n", bit.a, bit.b, bit.c);  // 1,7,15

    // 指針操作 + 復合位運算
    pbit->a = 0;
    pbit->b &= 3;   // 相當於 pbit->b = pbit->b & 3  -> 7 & 3 = 3
    pbit->c |= 1;   // 相當於 pbit->c = pbit->c | 1  -> 15 | 1 = 15
    printf("修改後: %d,%d,%d\n", pbit->a, pbit->b, pbit->c); // 0,3,15

    return 0;
}

typedef:為類型起別名,提升可讀性與可移植性

基本語法

typedef 原類型名 新類型名;
  • typedef 在編譯階段處理,而 #define 在預處理階段單純文本替換。
  • 新類型名慣用全大寫或 _t 後綴(如 uint32_t)。
  • 不創建新類型,只是別名,類型檢查完全等同原類型。

典型應用場景

1. 基本類型別名

typedef int INTEGER;
INTEGER a, b;  // 等同 int a, b;

2. 數組別名

typedef char NAME[20];
NAME a1, a2, s1, s2;  // 等同 char a1[20], a2[20], s1[20], s2[20];

3. 指針別名

typedef char *PSTR;
PSTR p1, p2;  // 等同 char *p1, *p2;
// 注意:typedef char *PSTR; 後 PSTR 是指針類型
// 若寫 typedef char * PSTR; const PSTR p;  p 是 char * const (常量指針),非 const char*

4. 結構體別名(最常用)

typedef struct Stu {
    char name[20];
    int age;
    char sex;
} STU;

STU body1, body2;  // 等同 struct Stu body1, body2;
// 甚至可匿名結構體直接別名
typedef struct { int x, y; } Point;
Point p1 = {1,2};

5. 函數指針別名(簡化複雜聲明)

// 原聲明:int (*cmp)(const void*, const void*);
typedef int (*CmpFunc)(const void*, const void*);

void sort(void *base, size_t n, size_t sz, CmpFunc cmp);  // 極度清晰

typedef vs #define 對比

特性typedef#define
處理階段編譯期預處理期
語義類型別名文本替換
指針聲明typedef char *PSTR; const PSTR p; → char * const p#define PSTR char *; const PSTR p; → const char *p (語義不同!)
作用域遵循 C 作用域規則無作用域,全局替換
調試符號保留類型信息無類型信息

本章綜合小結

  1. 枚舉:基本類型,取值集合固定,元素為常量,配合 switch 安全重構。
  2. 位運算:& | ^ ~ << >> 兩類(邏輯/移位),可構成復合賦值 &= |= ^= <<= >>=。
  3. 位運算應用:置位/清零/翻轉、數據壓縮存儲、並行位運算(SIMD 前身)。
  4. 位域:本質是結構體,按位分配內存,定義/聲明/使用同結構體。實現數據壓縮、節省空間、提升效率(視架構而定)。
  5. typedef:用戶自定義類型別名,照顧編程習慣,增強可讀性,編譯期處理,優於宏定義。

工程建議

  • 跨平台協議解析:手寫掩碼+移位函數,禁用位域。
  • 寄存器映射:位域 + volatile,配合編譯器屬性控制佈局。
  • 項目統一:建立 types.h 統一定義 u8/u16/u32/i8/i16/i32/bool_t 等別名,禁用原始類型。
  • 枚舉作狀態機:開啟 -Wswitch-enum,讓編譯器守護完整性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved