11.3. 接口特定的類型

2018-02-24 15:50 更新

11.3.?接口特定的類型

內(nèi)核中一些通常使用的數(shù)據(jù)類型有它們自己的 typedef 語句, 因此阻止了任何移植性問題. 例如, 一個進(jìn)程標(biāo)識符 ( pid ) 常常是 pid_t 而不是 int. 使用 pid_t 屏蔽了任何在實際數(shù)據(jù)類型上的不同. 我們使用接口特定的表達(dá)式來指一個類型, 由一個庫定義的, 以便于提供一個接口給一個特定的數(shù)據(jù)結(jié)構(gòu).

注意, 在近期, 已經(jīng)相對少定義新的接口特定類型. 使用 typedef 語句已經(jīng)有許多內(nèi)核開發(fā)者不喜歡, 它們寧愿看到代碼中直接使用的真實類型信息, 不是藏在一個用戶定義的類型后面. 很多老的接口特定的類型在內(nèi)核中保留, 但是, 并且它們不會很快消失.

甚至當(dāng)沒有定義接口特定的類型, 以和內(nèi)核其他部分保持一致的方式使用正確的數(shù)據(jù)類型是一直重要的. 一個嘀噠計數(shù), 例如, 一直是 unsigned long, 獨立于它實際的大小, 因此 unsigned long 類型應(yīng)當(dāng)在使用 jiffy 時一直使用. 本節(jié)我們集中于 _t 類型的使用.

很多 _t 類型在 <linux/types.h> 中定義, 但是列出來是很少有用. 當(dāng)你需要一個特定類型, 你會在你需要調(diào)用的函數(shù)的原型中發(fā)現(xiàn)它, 或者在你使用的數(shù)據(jù)結(jié)構(gòu)中.

無論何時你的驅(qū)動使用需要這樣"定制"類型的函數(shù)并且你不遵照慣例, 編譯器發(fā)出一個警告; 如果你使用 -Wall 編譯器標(biāo)志并且小心去除所有的警告, 你能有信心你的代碼是可移植的.

_t 數(shù)據(jù)項的主要問題是當(dāng)你需要打印它們時, 常常不容易選擇正確的 printk 或 printf 格式, 你在一個體系上出現(xiàn)的警告會在另一個上重新出現(xiàn). 例如, 你如何打印一個 size_t, 它在一些平臺上是 unsigned long 而在其他某個上面是 unsigned int?

無論何時你需要打印某個接口特定的數(shù)據(jù), 最好的方法是轉(zhuǎn)換它的值為最大的可能類型(常常是 long 或者 unsigned long ) 并且接著打印它通過對應(yīng)的格式. 這種調(diào)整不會產(chǎn)生錯誤或者警告, 因為格式匹配類型, 并且你不會丟失數(shù)據(jù)位, 因為這個轉(zhuǎn)換或者是一個空操作或者是數(shù)據(jù)項向更大數(shù)據(jù)類型的擴(kuò)展.

實際上, 我們在談?wù)摰臄?shù)據(jù)項不會常常要打印的, 因此這個問題只適用于調(diào)試信息. 常常, 代碼只需要存儲和比較接口特定的類型, 加上傳遞它們作為給庫或者內(nèi)核函數(shù)的參數(shù).

盡管 _t 類型是大部分情況的正確解決方法, 有時正確的類型不存取. 這發(fā)生在某些還未被清理的老接口.

我們在內(nèi)核頭文件中發(fā)現(xiàn)的一個模糊之處是用在 I/O 函數(shù)的數(shù)據(jù)類型, 它松散地定義( 看第 9 章"平臺相關(guān)性" 一節(jié) ). 松散的類型在那里主要是因為歷史原因, 但是在寫代碼時它可能產(chǎn)生問題. 例如, 交換給函數(shù)如 outb 的參數(shù)可能會有麻煩; 如果有一個 port_t 類型, 編譯器會發(fā)現(xiàn)這個類型.

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號