1樓:匿名使用者
該巨集在linux核心**(版本2.6.22)中定義如下:
#define offsetof(type, member) ((size_t) &((type *)0)->member);
分析:(type *)0,將 0 強制轉換為 type 型指標,記 p = (type *)0,p是指向type的指標,它的值是0。那麼 p->member 就是 member 這個元素了,而&(p->member)就是menber的位址,而基位址為0,這樣就巧妙的轉化為了type中的偏移量。
再把結果強制轉 換為size_t型的就ok了,size_t其實也就是int。
typedef __kernel_size_t size_t;
typedef unsigned int __kernel_size_t;
可見,該巨集的作用就是求出member在type中的偏移量。
2樓:
推薦你看《c陷阱與缺陷》,100+頁
至於你這裡的問題,我的理解是,type是巨集引數,比如他是int
((type *)0)是型別轉換,就是將0轉化為int 型指標
c語言的巨集定義問題
c語言與巨集指令有什麼關係?
3樓:匿名使用者
c語言裡面可以用巨集定義
都一樣了,就像你申明乙個變數一樣簡單.
4樓:平凡人生
#define m(巨集定義名) 2*3(表示式)
相當於用m替代後面的表示式
5樓:匿名使用者
c語言是高階語言。
巨集指令是組合語言程式中的一種偽指令。
最終它們都是編譯成cpu能夠識別的二進位制指令。
6樓:
巨集指令是在預編譯時解釋
而c語言是在編譯時解釋
7樓:自然之風祥
程式的整體編譯過程為:預處理、編譯、優化、彙編、連線。巨集指令主要用到的死#define,#ifdef,#endif等,預處理就是處理這些指令
c語言中「巨集」是個什麼東西 有什麼意義
8樓:匿名使用者
「巨集」,就是大的意思,c語言中的巨集,是一種可以代表任何語言元素的識別符號。
這裡還有乙個概念,就是巨集定義,例如:#define a b+c巨集定義出現在c語言的源**中,在正式編譯前,編譯器會進行預處理,而預處理過程包括乙個很重要的任務(當然還有其它任務),就是替換巨集,這種替換是一種機械的替換,並不考慮識別符號的語法,語義,也就是說當遇到上面的a時,會直接替換成b+c。
還有一種更加靈活的巨集,是帶引數的巨集,例如:#define f(a,b) (a)+(b)
替換時會根據引入引數,這樣,f(1,2)會被替換成(1)+(2)。
9樓:匿名使用者
巨集就是 用乙個宣告去定義一樣變數或者函式 就比如 你為你的朋友起個花名 你以後就可以用花名替代他原來的名字
c語言關於巨集的問題!
10樓:匿名使用者
這是帶引數的巨集,他的缺點是不止一次的計算他的引數。
它後是('a'<=(s[++i]) && (s[++i])<='z' ? (s[++i])-'a' +'a' : (s[++i]))
在執行過程中++i被執行了3次:1.'a'<=(s[++i]) 2.
(s[++i])<='z' 3.(s[++i])-'a' +'a' 執行完後i的值是3,即s[3]-'a'+'a'所以輸出:d
11樓:匿名使用者
輸出結果是d
因為程式執行了三次++i
c語言中的巨集定義問題 20
12樓:糖糖又笑了
你有什麼問題?
巨集定義就是簡單的替換
在程式設計中是經常用到的,筆試題也經常遇到
c語言巨集定義問題(#define)
13樓:風若遠去何人留
引數留空就好了。
string()
就是""
connect() 就是abc
測試**:
#include
#include
#define string(str) #str#define connect(part) abc##partint main ()
執行結果:
c語言中巨集替換的替換規則,C語言中,巨集替換的替換規則
焉秋梵正 簡單來說 巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 巨集替換是c c 的預處理中的一部分,在c 標準中有4條規則來定義替換。規則1 實參替換。本條規則描述帶引數的巨集的替換過程。對於巨集定義中的形參,在替換列表中,如果不是作為 或 的運算元,那麼將對應實參完全 相當於對實參進行求值 然...
c語言的問題,C語言的一個問題
這是中國mooc上的題目吧,你的程式其實是正確的。知道為何 說 格式錯誤 了嗎?include int main 上面這個程式經驗證是可通過的。include int main 而原先我的這個程式卻不行!0分!覺得明明是同一套程式吧,他喵的我發現運算子與變數之間要空格,評分系統才認你的程式,等號兩邊...
C語言問題,乙個C語言問題
錯誤是 d 了 因為陣列名s,代表字串陣列的首位址,s指向的位址就是s 0 的位址。gets s 正確則gets s 0 也是正確的,所以 a,c 正確。而scanf s s 1 實際上只是不從s 0 開始,而是從s 1 開始賦值而已,既然只輸給它5個字元,所以從s 1 開始賦值也不會過界,則b是正...