ioctl標頭檔案中特虎的地方

2021-09-06 04:33:31 字數 1087 閱讀 6418

surpring point: 1 _ioc_typecheck的寫法。2 對32位cmd定義的macro型別。

介紹之前先說下32位的cmd被分為4塊,不羅嗦,直接看巨集便知道了。

#define _ioc_nrbits  8

#define _ioc_typebits 8

#define _ioc_sizebits 14

#define _ioc_dirbits 2

#define _ioc_nrmask ((1 << _ioc_nrbits)-1)

#define _ioc_typemask ((1 << _ioc_typebits)-1)

#define _ioc_sizemask ((1 << _ioc_sizebits)-1)

#define _ioc_dirmask ((1 << _ioc_dirbits)-1)

#define _ioc_nrshift 0

#define _ioc_typeshift (_ioc_nrshift+_ioc_nrbits)

#define _ioc_sizeshift (_ioc_typeshift+_ioc_typebits)

#define _ioc_dirshift (_ioc_sizeshift+_ioc_sizebits)

上面包括  nr佔8位, type佔8位, size佔14位, dir(操作)佔2位。各個的掩碼,偏移,全部都定義為乙個macro。

1 _ioc_typecheck(t)的寫法

#define _ioc_typecheck(t) \

(sizeof(t) == sizeof(t[1]) && \

sizeof(t) < (1

<< _ioc_sizebits)) ? \

sizeof(t) < __invalid_size_argument_for_ioc

【精闢】其中t應當為乙個型別,比如t為int, int[10], struct型別。type[1]型別和type的sizeof是一樣的。

其次只有type型別的大小,14位所能表達的大小才成功。

C 中的標頭檔案

通常每乙個.cpp檔案都有乙個對應的.h檔案,但是也有例外如main函式所在的.cpp檔案。c 標準庫中除了定義c 語言特有的功能外,還相容了c語言的標準庫。c語言的標頭檔案形如 name.h,而c 中將這些檔案命名為cname,去掉了.h字尾,在前面新增了字母c,c的含義表示這是乙個屬於c語言標準...

C 中的標頭檔案

標頭檔案的字尾在c 的不同實現中是不同,所以標準c 也沒指定標頭檔案字尾,c 的標頭檔案包含一般不指明字尾,例如 include 而在c語言中.h是指定的標頭檔案字尾 如果你直接 include 將直接應用c的標頭檔案庫的指定檔案,這個時候你可以直接使用對應的檔案中的函式等,而如果使用了 inclu...

c 中的標頭檔案

c 中的標頭檔案裡面包含的是某個庫的外部宣告函式或者變數。因此為了宣告庫中已有的函式和變數,程式中只要包含標頭檔案即可。引入標頭檔案,要使用 include預處理器命令。預處理器是乙個程式,它用定義好的模式代替源 中的模式,這發生在編譯之前。也就是說,在編譯之前,預處理器會將指定的標頭檔案開啟,然後...