日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

错误: 非法的表达式开始_虽然这两个C语言宏定义很简单,但是能在程序运行前找到错误代码...

發布時間:2024/8/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 错误: 非法的表达式开始_虽然这两个C语言宏定义很简单,但是能在程序运行前找到错误代码... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天翻看 Linux 內核源代碼時,發現兩行非常有意思的C語言代碼,如下:

#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))#define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))

有意思的宏

這兩行C語言代碼有什么含義呢?

要理解這兩行C語言代碼,關鍵就是理解 int:-!!(e) ,但是“:-!!”符號看起來很陌生,C語言中似乎并沒有這樣的符號。其實不是的,“:-!!”這幾個符號都是C語言中的基本符號組成的。

首先,不應該將“:”與 int 剝離,所以 int:-!!(e) 應該這么看,int: (-!!(e)),這就清楚了,顯然是位域(bitfield)的定義方法,其中 -!!(e) 是位域的長度。

對于 -!!(e),應該將 e 看作是一個條件表達式,此時 !! 符號可以將其轉換為布爾值(即0或者1,讀者自己思考原因)。在C語言中,非零即可認為是真,因此 2,3,88 等都看看作真。在本例中,定義位域時,長度不應該超過 int 的寬度,所以如果沒有 !! 符號,BUILD_BUG_ON_XX 宏的適用范圍就很小了。

現在明白了

現在明白了,!!(e) 的值要么是 0,要么是 1。再考慮前面的負號,-!!(e) 要么是 0,要么是 -1,即對于 int:-!!(e) 來說,只有兩種情況:

int: 0// 或者int: -1

顯然,位域的長度不能是負數,所以如果表達式 e 為真時,宏 BUILD_BUG_ON_XX 就是非法的了,在編譯階段就會報錯。

“編譯時”和“運行時”

從某種程度上來看,上述C語言宏可以看作是編譯時的 assert()。有讀者可能會問,既然如此,為什么不直接使用 assert(),而是花大力氣自定義呢?

為什么不直接使用 assert(),而是花大力氣自定義呢?

讀者應該注意“編譯時”這個關鍵詞,BUILD_BUG_ON_XX 宏在編譯階段就可以檢查錯誤,這就能確保程序員能夠在程序運行之前發現錯誤,并修改相關的C語言代碼。與之對應的, assert() 只能在程序運行時檢查錯誤,程序運行時出錯就麻煩了,至少需要程序員編寫相應的錯誤處理邏輯C語言代碼。

如果能夠在程序開發階段發現錯誤,是多么美好的一件事啊。

如果能夠在程序開發階段發現錯誤,是多么美好的一件事啊。

那 assert() 就沒有存在的必要了?暫時還不是,對于 BUILD_BUG_ON_XX 宏中的條件表達式 e,目前的C語言語法只支持常量表達式,對于變量表達式就無能為力了,只能使用 assert(),例如:

int a = 1;BUILD_BUG_ON_ZERO(1<0); // 合法BUILD_BUG_ON_ZERO(a<0); // 非法assert(a<0); // 合法

讀者可能會問,BUILD_BUG_ON_XX 宏只能判斷常量表達式,那它還有什么應用價值呢?畢竟兩個常量的對比誰會弄錯呢?BUILD_BUG_ON_XX 宏當然有應用價值,而且還挺好用,下一節將結合實例討論,敬請關注。

事實上,這種借助C語言語法的實現編譯時判斷的技巧有很多種,例如:

借助C語言語法的實現編譯時判斷的技巧

它們的原理和作用都是類似的,留給讀者自己分析了,這里不再贅述。

歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的错误: 非法的表达式开始_虽然这两个C语言宏定义很简单,但是能在程序运行前找到错误代码...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产网红主播精品av | 成人性色生活片 | 中文字幕在线播出 | 日韩精品免费一区二区三区 | 黄色在线播放视频 | 国外成人免费视频 | 中文字幕av无码一区二区三区 | 国产在线一卡二卡 | 精品人妻一区二区三区三区四区 | 色5566| av在线中文 | 黑人玩弄人妻一区二区三区免费看 | 人妻换人妻仑乱 | 精品视频在线观看免费 | 久久人妖| 日韩中文字幕视频在线观看 | 中文字幕成人一区 | 无码人妻精品一区二区三区9厂 | 国产精品300页 | 狠狠的干狠狠的操 | 欧美va视频| 欧美精品色呦呦 | 亚洲一区二区三区在线观看视频 | a视频免费观看 | 久久入 | 一本毛片| 久久国产精品-国产精品 | 黑人操亚洲女人 | 欧美日韩精品一区二区三区视频播放 | 久久五月网 | 一级黄大片 | 日韩成人在线影院 | 亚洲图片视频小说 | 国产高清sp| 日韩性生活大片 | 99国产精品久久久 | www.爱爱.com| 国产美女激情 | 麻豆一区二区 | 一本—道久久a久久精品蜜桃 | 亚洲一区二区三区精品视频 | 玩弄人妻少妇500系列视频 | 国产免费一区二区三区免费视频 | 影音先锋黑人 | 国产一级黄色av | 国产欧美一区二区三区视频在线观看 | 国产处女 | 91在线| 亚洲毛片av | 人妻射精一区二区 | 日本免费一级片 | 丰满少妇aaaaaa爰片毛片 | 国产又粗又大又爽视频 | 久久一区视频 | 成人午夜黄色 | 国产成人av在线播放 | 日韩激情网 | 亚欧在线播放 | 色精品视频| 一炮成瘾1v1高h | 精品一区二区三区毛片 | 久久黄色一级视频 | 黄色片在线观看视频 | 国产精品一区二区在线免费观看 | 色无极亚洲色图 | 黄色三级三级三级 | 欧美一区永久视频免费观看 | 在线观看的黄色网址 | 国产精品第三页 | 日本不卡一二三 | 欧美放荡办公室videos4k | 久久嫩草精品久久久久 | 日韩欧美在线中文字幕 | 国产一卡在线 | 亚洲少妇网 | 精品国产乱码久久久久久影片 | 91免费看大片 | 精品一区二区在线看 | 福利片一区二区 | 国产亚洲精品久久久久久777 | 伊人日日夜夜 | 日韩一区二区影视 | 一级片免费的 | 亚洲天堂91| 久一区二区三区 | 动漫av在线免费观看 | 欧美成人精品一区二区综合免费 | 久久综合视频网 | 日本三级视频在线观看 | 女十八毛片 | 久久亚洲精品中文字幕 | 狠狠爱成人 | 久久艹艹| 日本a在线播放 | 人人爽视频 | 懂色av一区二区三区免费观看 | 中国毛片网 | 精品国产乱码久久久久久图片 | 高清欧美精品xxxxx在线看 |