神奇的巨集定義

来源:https://www.cnblogs.com/zhangyi1357/archive/2022/04/25/16192431.html
-Advertisement-
Play Games

今天的是Python第三話,前面的知識點給大家放在上面了,零基礎的小伙伴可以自己動手領取,學好Python的基礎知識對我們後期 去實現Python案例幫助很大,知其然才能更好解決問題,話不多說,直接開始了。 函數 Python學習交流Q群:906715085#### print(" 定義函數 "); ...


閱讀某項目時,遇到了以下兩個神奇的巨集用法

IFDEF(CONFIG_DEVICE, init_device());
MUXDEF(CONFIG_TRACE, "ON", "OFF")

顧名思義,第一個的意思就是如果定義了CONFIG_DEVICE巨集才執行後面的函數調用,第二個的含義則是如果定義了CONFIG_TRACE巨集則為"ON",否則為"OFF"

大家可以思考思考,這樣的巨集你們會怎麼實現呢?
Hint:並不簡單哦,會用到不少巨集定義的技巧。(如果你有簡單的方法請一定留言告訴我!)

點擊查看解答
// macro concatenation
#define concat_temp(x, y) x ## y
#define concat(x, y) concat_temp(x, y)

// macro testing
// See https://stackoverflow.com/questions/26099745/test-if-preprocessor-symbol-is-defined-inside-macro
#define CHOOSE2nd(a, b, ...) b
#define MUX_WITH_COMMA(contain_comma, a, b) CHOOSE2nd(contain_comma a, b)
#define MUX_MACRO_PROPERTY(p, macro, a, b) MUX_WITH_COMMA(concat(p, macro), a, b)

// define placeholders for some property
#define __P_DEF_0  X,
#define __P_DEF_1  X,

// define some selection functions based on the properties of BOOLEAN macro
#define MUXDEF(macro, X, Y)  MUX_MACRO_PROPERTY(__P_DEF_, macro, X, Y)

// simplification for conditional compilation
#define __IGNORE(...)
#define __KEEP(...) __VA_ARGS__

// keep the code if a boolean macro is defined
#define IFDEF(macro, ...) MUXDEF(macro, __KEEP, __IGNORE)(__VA_ARGS__)

解釋每一個巨集很枯燥,不如讓做一個人形預處理器,直接針對第一個巨集用法對其進行展開(第二個巨集的用法包含在第一個之中)

// For CONFIG_DEVICE not defined
IFDEF(CONFIG_DEVICE, init_device());
MUXDEF(CONFIG_DEVICE, __KEEP, __INGORE)(init_device());
MUX_MACRO_PROPERTY(__P_DEF_, CONFIG_DEVICE, __KEEP, __INGORE)(init_device());
MUX_WITH_COMMA(concat(__P_DEF_, CONFIG_DEVICE), __KEEP, __INGORE)(init_device());
MUX_WITH_COMMA(__P_DEF_CONFIG_DEVICE, __KEEP, __INGORE)(init_device());
CHOOSE2nd(__P_DEF_CONFIG_DEVICE __KEEP, __INGORE)(init_device());

註意以上展開過程保留了CONFIG_DEVICE,如果其定義為1或0,則繼續展開可以得到

CHOOSE2nd(X, __KEEP, __INGORE)(init_device());
__KEEP(init_device());
init_device();

如果其沒有定義則該語句直接變成了一條空語句。

怎麼樣是不是很神奇呢?

原文鏈接:https://www.cnblogs.com/zhangyi1357/p/16192431.html
轉載請註明出處!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 訪問者模式是什麼 訪問者是一種行為型設計模式, 允許你在不修改已有代碼的情況下向已有類層次結構中增加新的行為。 為什麼用訪問者模式 訪問者模式建議將新行為放入一個名為訪問者的獨立類中,而不是試圖將其整合到已有類中。現在需要執行操作的原始對象將作為參數被傳遞給訪問者中的方法, 讓方法能訪問對象所包含的 ...
  • 有了《系統架構的11條原則》,真正到設計階段還有另外11個考慮。 系統正確性 考慮一:負負得正 假如我們看到某個代碼,明顯有邏輯錯誤,想隨手改改。你就要考慮一件事情:這段明顯有問題的代碼為什麼線上上運行著沒有人來報bug?有一種正常運行叫做【負負得正】。如果把錯誤的邏輯改對了反而可能引起問題。 這種 ...
  • 組織管理模塊屬於SaaS產品非常底層的架構,非常考驗架構能力,幾乎所有的業務場景都需要應用組織數據,背後反應的是企業決策層的經營戰略和財務戰略,因此需要掌握一定的企業管理知識和財務知識,如果能夠掌握組織管理的概念和要點,對設計好SaaS產品幫助巨大。 ...
  • 如果軟體系統存在持續的迭代周期,那麼其中業務、技術、架構的複雜性都會直線拉升,其相應的開發難度也會提高,隨之而來的壓力會持續在開發和測試之間來回橫跳。 ...
  • 鑒於上一篇中最後三個問題: 1、上述程式是否能進行優化(比如功能相同的) 2、創建三個3個實例,用了3個語句,能否建一個函數,只輸入一個數n,就自動創建n個實例?同時,每個實例的num_times隨機,(n比較大時,num_times應該比較小) 3、當實現上述功能後,程式運行,只輸入一個參數(創建 ...
  • L1-081 今天我要贏 #include <iostream> using namespace std; int main() { cout << "I'm gonna win! Today!\n2022-04-23"; } 2018 年我們曾經出過一題,是輸出“2018 我們要贏”。今年是 20 ...
  • 隨著短視頻的大火,不僅可以給人們帶來娛樂,還有熱點新聞時事以及各種知識,刷短視頻也逐漸成為了日常生活的一部分。本文以一個簡單的小例子,簡述如何通過Pyhton依托Selenium來爬取短視頻,僅供學習分享使用,如有不足之處,還請指正。 ...
  • OO第二單元電梯總結 架構模式 Hw5, Hw6, Hw7三次作業架構基本沒有巨大變化,屬於增量的疊加開發 hw5 一級生產者消費者模型with策略類分離 第一次作業, 我做了兩種架構的嘗試, 寫了: 調度線程祭天型 單托盤 帶調度器線程的兩級托盤 在嘗試寫了兩種架構的基礎上, 我分析了一下兩種架構 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...