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

C99 複合字面量完全指南:匿名物件即建即用

     編輯:關於C

什麼是複合字面量?

C99 引入,語法:(型別名){初始化列表},建立一個無名稱的匿名物件,產生右值,可用於任何同型別右值合法的場合。

基本語法與型別推導

// 等價於 int a[2] = {10, 20};
(int [2]){10, 20}

// 省略長度,由初始化列表推導
(int []){10, 20, 30}  // 型別 int[3]

// 指針接收首地址
int *p = (int []){10, 20, 30}; // *p == 10

核心用法場景

1. 直接作為函數實參傳遞


int sum(int arr[], int n);
int total = sum((int []){1, 2, 3, 4}, 4); // 無需先建立陣列變量

2. 多維陣列匿名建構


int (*p)[4]; // 指向 int[4] 的指針
p = (int [2][4]){{1,2,3,4}, {5,6,7,8}};

3. 結構體匿名建構


struct Point { int x, y; };
void draw(struct Point p);
draw((struct Point){10, 20}); // 臨時點座標

4. 避免變量汙染作用域


for (int i = 0; i < n; i++) {
    process((struct Request){.id=i, .priority=high}); // 循環內臨時物件
}

完整可執行範例

#include <stdio.h>
#define COLS 4

void sum1d(int a[], int n) {
    int tot = 0;
    for (int i = 0; i < n; i++) tot += a[i];
    printf("1D sum = %d\n", tot);
}

void sum2d(int a[][COLS], int rows) {
    int tot = 0;
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < COLS; j++)
            tot += a[i][j];
    printf("2D sum = %d\n", tot);
}

int main() {
    int *p1 = (int [2]){10, 20};
    int (*p2)[COLS] = (int [2][COLS]){{1,2,3,4}, {5,6,7,8}};
    
    sum1d(p1, 2);
    sum2d(p2, 2);
    
    // 直接傳遞
    sum1d((int []){5, 10, 15}, 3);
    return 0;
}

生命週期與儲存類別

  • 檔案作用域(全域)複合字面量 → 靜態儲存期,程式全程有效
  • 區塊作用域(函數內)複合字面量 → 自動儲存期,所在區塊結束失效
  • 不可修改字串字面量不同,複合字面量可修改(除非含 const)

避坑指南

  1. 不要返回區塊作用域複合字面量的地址(同區域變量陷阱)
  2. 大型複合字面量作為參數傳遞會整體複製,考慮改傳指針
  3. C++ 不支援 C99 複合字面量,跨語言專案謹慎使用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved