簡體   English   中英

C中花括號的奇怪用法

[英]Odd use of curly braces in C

抱歉問了一個簡單的問題,但我正在度假,正在閱讀一本關於核心音頻的書,而且我沒有帶 C 或 Objective C 的書......

這個變量定義中的花括號有什么作用?

MyRecorder recorder = {0};

假設MyRecorder是一個struct ,這MyRecorder每個成員設置為它們各自的零表示0表示整數, NULL表示指針等)。

實際上,這也適用於所有其他數據類型,例如intdouble 、指針、數組、嵌套結構……,您可以想象的一切(感謝 pmg 指出這一點!)

更新:從上面鏈接的網站中摘錄的引用,引用了 C99 的最終草案:

[6.7.8.21] 如果花括號括起來的列表中的初始值設定項少於聚合的元素或成員,[...] 聚合的其余部分應隱式初始化,與具有靜態存儲持續時間的對象相同。

它根據 C99 標准將recorder結構的所有成員初始化為0 看起來它用0位初始化結構的每一位。 但並非每個編譯器都如此。

請參閱此示例代碼,

#include<stdio.h>

struct s {
    int i;
    unsigned long l;
    double d;
};

int main(){
    struct s es = {0};
    printf("%d\n", es.i);
    printf("%lu\n", es.l);
    printf("%f\n", es.d);
    return 0;
}

這是輸出。

$ ./a.out 
0
0
0.000000

實際上,它不會初始化結構的所有元素,只是初始化第一個元素。 但是,其他的會自動初始化為 0,因為這是 C 標准要求做的。

如果你把:MyRecorder recorder = {3};

第一個元素將為 3,其他元素將為 0。

與 C++11 不同,在 C99 中,初始化括號中必須至少有一個元素。

C++11 結構:

MyRecorder recorder{};

C結構:

MyRecorder recorder = {0};

MyRecorder可能是以下之一,您正在嘗試用零初始化所有元素

typedef struct _MyRecorder1 {
    int i;
    int j;
    int k;
}MyRecorder1;

typedef int MyRecorder2[3];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM