2010-10-07 66 views
9

我已經開始閱讀Unix v6上的獅子會評論。我遇到了這些我從未見過的C語言片斷。作者確實提供了某種解釋,但有人可以向我解釋這裏發生了什麼?C中的匿名結構在Unix內核中找到

params.h

SW 0177570 
...... 
struct { int integ; }; 

和由作者

SWunix/prf.c

if(SW->integ == 0) 

說明此使用的作爲值前所定義 0177570.這是內核地址的 只讀處理器寄存器,用於存儲控制檯切換寄存器的 設置。 該聲明的含義是明確的:獲取位置0177570處的 內容並查看它們是否爲 爲零。問題是在 C中表示這個。代碼if (SW == 0)不會傳達這個意思。很明顯, SW是一個指針值,應該是 解除引用。編譯器可能已被 更改爲接受 if (SW-> == 0) 但按照現狀,這在語法上不正確。通過發明一個虛擬結構, 一個元素integ,程序員找到了一個令人滿意的解決方案,他的問題是 。

我的問題主要是如何工作?當編譯器看到SW->integ時,它如何將SW與匿名結構關聯?

回答

6

IIRC古代C編譯器將所有字段名稱(如integ)保存在一個名稱空間中,而不是根據struct類型創建名稱空間。他們也沒有區分struct指針和int指針,因此每個指針都有一個對應於其第一個sizeof(int)字節的integ字段。由於integstruct中的第一個值,並且類型爲int,因此SW->integ對應於*((int *)SW)

+2

在現代C中,我們使用'int * const SW = 0177570;'但是在優化器出現之前,這會讓Ken和他的成本花費兩個字節:) – 2010-10-07 11:42:01