例解GNU C之匿名聯合或結構體

2021-06-13 06:48:41 字數 2491 閱讀 4678

分類: 漫談c語言

2011-12-04 12:43

488人閱讀收藏 

舉報cstruct

linux核心

initialization

gcc編譯器

前言:計算機語言是編譯器和程式設計師交流的依據和規範,gnu c是gcc特有的功能,在linux核心中被廣泛應用。

幫助文件:

在gnu c中,可以在結構體中宣告某個聯合體(或結構體)而不用指出它的名字,如此之後就可以像使用結構體成員一樣直接使用其中聯合體(或結構體)的成員。

舉例,如test.c: 

[cpp]view plain

copy

#include 

struct

test_struct ;  

intnum;  

};  

intmain(

void

)  ;  

printf("test_struct.gender = %c, test_struct.id = %d\n"

,  test_struct.gender, test_struct.id);  

return

0;  

}  

例子輸出結果: 

[cpp]view plain

copy

test_struct.gender = f, test_struct.id = 70  

例子中的第17行,結構體變數test_struct直接使用聯合體中的成員gender或id。

gcc預設情況下可以使用gnu c的各種擴充套件功能,如果上例使用c99標準編譯的話,會產生以下的錯誤: 

[cpp]view plain

copy

$ gcc -std=c99 test.c -o test  

[cpp]view plain

copy

test.c:8:6: warning: declaration does not declare anything  

test.c: in function 'main'

:  test.c:14:12: warning: excess elements in struct

initializer  

test.c:14:12: warning: (near initialization for

'test_struct'

)  test.c:17:17: error: 'struct test_struct'

has no member named 

'gender'

test.c:17:37: error: 'struct test_struct'

has no member named 

'id'

修改上例,使其符合c99標準,如test01.c: 

[cpp]view plain

copy

#include 

union

test_union ;  

struct

test_struct ;  

intmain(

void

)  ;  

printf("test_struct.test_union.gender = %c, test_struct.test_union.id = %d\n"

,  test_struct.test_union.gender, test_struct.test_union.id);  

return

0;  

}  

例子輸出結果: 

[cpp]view plain

copy

$ gcc -std=c99 test01.c -o test01  

[cpp]view plain

copy

test_struct.test_union.gender = f, test_struct.test_union.id = 70  

在linux核心中常用匿名聯合(或結構體),如在linux-2.6.38.8/fs/sysfs/sysfs.h檔案中struct sysfs_dirent結構體的定義: 

[cpp]view plain

copy

struct

sysfs_dirent ;  

unsigned int

s_flags;  

unsigned short

s_mode;  

ino_t           s_ino;  

struct

sysfs_inode_attrs *s_iattr;  

};  

例解GNU C之typeof 一)

前言 計算機語言是編譯器和程式設計師交流的依據和規範,gnu c是gcc特有的功能,在linux核心中被廣泛應用。幫助文件 關鍵字typeof用於獲取表示式的資料型別。簡單例子,如清單1 cpp view plain copy char chptr01 typeof chptr01 ch 等價於ch...

grep 高階例解

grep 是在linux查詢文字過程最常用的命令,熟悉grep的一些常用命令,可以在個別時候有效提高工作效率。場景一 需要查詢乙個目錄及子目錄所有檔案中出現 aaa 但是同時不能出現bbb的行,查詢不區分大小寫 grep rin aaa grep v bb 解釋 r 遞迴查詢 i 不區分大小寫 n ...

PHP匿點之位運算按位取反

我們看示例 a 8 var dump a 先不要看結果,試想下結果是多少?然後我們執行下看看,納尼?和我們設想的不一樣,奇怪了 什麼原因呢 於是我們翻看php中文手冊 a not 按位非 將 a 中為 0 的位設為 1,反之亦然。我只是簡單的理解為 0變1,1變0。原來按位取反以十進位制輸出並不是簡...