首页
/
每日頭條
/
生活
/
c語言程序如何獲得warning信息
c語言程序如何獲得warning信息
更新时间:2024-12-27 22:18:51

在嵌入式中,一般涉及到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
推荐阅读
皮衣怎麼保養 怎麼防止皮衣發黴
皮衣怎麼保養 怎麼防止皮衣發黴
皮衣和普通的衣服不一樣,進入冬季之後,人們穿着皮衣不僅可以禦寒保暖,還能美化生活,但是皮衣是一種季節性的衣服,天氣熱了的話,穿皮衣就不是很适合了,但是,我們此時穿皮衣怎麼保養才好呢,在放置的時間内,做好皮衣的保養措施也是很重要的,這一點我們不能大意才是。在平時皮衣怎麼保養,我們一定要記住,對于我們平...
2024-12-27
常用馬桶清潔妙招集錦
常用馬桶清潔妙招集錦
常用馬桶清潔妙招集錦常用馬桶清潔妙招集錦1、食醋除垢法:将醋和清水的混合液倒入馬桶,浸泡半天後,積垢會一刷即掉。2、小蘇打除垢:将小蘇打撒在馬桶裡,然後用熱開水沖泡半個小時,污垢即可以刷掉。3、砂紙除垢法:用最細的砂紙來摩擦馬桶污垢,可去除清潔劑不能去除的污垢。4、自制小刷子刷洗馬桶:抽水馬桶生成黃...
2024-12-27
鐵鍋生鏽怎麼辦
鐵鍋生鏽怎麼辦
很多人喜歡用鐵鍋來做飯,用鐵鍋可以在每天的飲食中就補充了鐵元素,不用可以的去補充了。對身體是有好處的,但是鐵鍋也是有缺點的,那就是容易生鏽,導緻每次做菜之前都要仔細清洗,否則就會因為鐵鏽味影響菜的口感,為了能做出口味好的菜肴,又能補充鐵元素,找到鐵鍋生鏽怎麼辦的方法是最好的選擇。面對鐵鍋生鏽怎麼辦這...
2024-12-27
家居除臭技巧
家居除臭技巧
臭味來源:玄關、鞋櫃除臭幫手:絲襪、報紙、咖啡或茶葉渣不少家庭把鞋櫃擺在玄關,玄關因此就很容易飄出臭味。想要解決這個問題,首先把鞋子統統搬出來,徹底清理幹淨,每雙鞋子先用幹布擦拭,接着鞋櫃内鋪上舊報紙數張。然後,在舊絲襪裡塞上曬幹的茶葉渣或咖啡渣,做成除臭包。一些塞入鞋内,一些擺在鞋櫃角落,對于消除...
2024-12-27
手表中不小心進入積水,怎樣去掉手表内的積水
手表中不小心進入積水,怎樣去掉手表内的積水
早上洗漱時候,不小心将手表浸到水了,或者天熱去遊泳館遊泳,不小心把表掉入水裡了,不知道怎樣才能去除表内的積水?可以使用以下方法:不小心發生表内進水,可用一種叫矽膠的顆粒狀物質與以及積水的手表一起放進一個密閉的容器内,數小時侯取出手表,積水即全消失。此法簡單經濟,對手表的精确度和壽命均無任何損害,已經...
2024-12-27
Copyright 2023-2024 - www.tftnews.com All Rights Reserved