首页
/
每日頭條
/
生活
/
c語言程序如何獲得warning信息
c語言程序如何獲得warning信息
更新时间:2025-07-12 13:19:53

在嵌入式中,一般涉及到Linux内核代碼的時候,會遇到typeof(注意不是typedef)和container_of,本文使用代碼方式介紹typeof關鍵字和container_of宏。

一、typeof“關鍵字”

在ANSI C标準中定義了sizeof關鍵字用于獲取變量和數據類型在内存中所占的字節數。GNU C中又擴展了typeof“關鍵字”,用于獲取變量或表達式的類型。typeof是gcc标準,目前尚未納入C标準。如下,代碼使用介紹:

c語言程序如何獲得warning信息(嵌入式C語言中typeof與container)1

(typeof代碼)

c語言程序如何獲得warning信息(嵌入式C語言中typeof與container)2

(gcc編譯運行)

由此可知,通過typeof獲取變量的類型後,可以使用該類型再定義一個變量。

typeof(m) n = 6相當于

int n = 6;

如此看來,typeof并沒有什麼新奇的?但如果配合下面的container_of宏,效果就顯著多了。

二、container_of宏

有了typeof的基礎,直接在查看該宏的真面目:

c語言程序如何獲得warning信息(嵌入式C語言中typeof與container)3

container_of的定義

上述就是該宏的真面目,可以說設計的相當巧奪天工。這個宏的主要作用:根據結構體某一成員的地址,獲取這個結構體的首地址。該宏需要三個元素:ptr為結構體成員member的地址,member為結構體的成員,type為結構體類型。

上述描述比較幹澀,直接上代碼調試(使用自定義的CONTAINER_OF):

c語言程序如何獲得warning信息(嵌入式C語言中typeof與container)4

container_of代碼示例

c語言程序如何獲得warning信息(嵌入式C語言中typeof與container)5

container_of運行

從上述看,僅需要知道原結構體的一個成員team.number,可以推導原結構體的地址team,自然就可以獲取該結構體其他成員的值。

實際使用的情況:假如傳給某個函數的參數是某個結構體的成員變量,但是在這個函數中可能還需要使用到該結構體的其他成員變量,那麼這時候使用container_of就非常方便。

一個結構體數據類型,在相同編譯環境下,各個成員相對于結構體首地址的偏移是固定不變的。即當結構體的首地址為0時,結構體中各個成員的地址在數值上等于結構體成員相對于結構體首地址的偏移。

仔細分析:

#define OFFSET_OF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)。結構體類型TYPE和結構體TYPE的成員MEMBER,将0強制轉化為一個指向TYPE類型的結構體常量,然後通過這個常量指針房屋成員,獲取MEMBER的地址,它的大小在數值上等于MEMBER成員在結構體TYPE中的偏移。

如何獲取ptr指針類型,即通過(typeof的使用):

typeof( ((type *)0)->member ) *__mptr = (ptr)方式獲取。

至此,typeof與container_of的基本介紹完畢。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
常見家用中央空調優缺點有哪些
常見家用中央空調優缺點有哪些
如今傳統空調仍舊大行其道,而家用中央空調也不甘示弱,緊居其後,遂有取代之勢。現在市面上常見的家用中央空調有冷/熱水機組;風管式系統;多聯機型系統。那麼這些空調各自的優缺點有哪些呢?就和小編一起來看看吧!常見家用中央空調優缺點有哪些一、冷/熱水機組1、介紹冷/熱水機組的輸送介質通常為水或者乙二醇溶液。...
2025-07-12
企業郵箱怎麼登陸
企業郵箱怎麼登陸
1、首先需要打開郵箱設置頁面。點擊其它郵箱。2、然後按實際填上自己的賬戶名和密碼,然後點擊手動設置。...
2025-07-12
炸雞裹粉起鱗片原理
炸雞裹粉起鱗片原理
要給炸雞裹出鱗片狀面粉很簡單,我們要先把雞肉放入碗中裹上面粉,再将它放入清水中蘸一下把面粉都打濕并濾掉多餘的水分,接着再給雞肉裹一次面粉這樣重複幾次就可以了,我們還可以對雞肉進行揉搓輔助鱗片成型。我們平時在外面購買炸雞的時候,炸雞表面的面衣會呈現很好看的魚鱗狀,但是我們自己在家做炸雞時卻很難做出這種...
2025-07-12
智能冰箱不制冷怎麼辦
智能冰箱不制冷怎麼辦
現在人們的生活條件慢慢變好了,所以大部分的家庭都開始使用智能冰箱了,相較于普通冰箱而言,智能冰箱可以更為便捷調節冰箱溫度與濕度,出現故障,我們也可以更加直觀地看到。今天小編就來介紹一下智能冰箱不制冷怎麼辦?一起看看吧!智能冰箱不制冷怎麼辦一、使用時間過長智能冰箱的使用年限一長久,就容易導緻智能冰箱的...
2025-07-12
慕斯蛋糕和冰淇淋蛋糕有什麼區别
慕斯蛋糕和冰淇淋蛋糕有什麼區别
慕斯蛋糕和冰淇淋蛋糕的區别在原料以及制作工藝等方面,慕斯蛋糕在制作的過程需要加入吉利丁之類的原料定型,且在制作的時候将材料融合冷藏即可,也冰淇淋蛋糕主要材料是蛋黃,在制作的時候需要專業設備,以此來保證其風味。慕斯蛋糕和冰淇淋蛋糕的差别 在夏天的時候,比起傳統的奶油蛋糕,慕斯蛋糕和冰淇淋蛋糕更瘦一些年...
2025-07-12
Copyright 2023-2025 - www.tftnews.com All Rights Reserved