C語言的巨集的問題,C語言的乙個巨集的問題

時間 2022-06-13 16:50:09

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是正...