宏定義中#與##的注意事項

1. #是字符串化操作符。它的作用是將宏參數轉換成字符串

2.?##是標記粘貼操作符。它的作用是將兩個標記連接起來形成一個新的標記

#define TEST1(a) #a
#define TEST2(a) b##a/***********************************************************/
舉例:TEST1(hello) 會被替換為 "hello" 字符串TEST2(hello)會被替換為 bhello, 編譯過程中會將bhello當作一個變量
/***********************************************************/

字符串拼接

#define HELLO_WORLD "Hello, " "World!"/***********************************************************/
在HELLO_WORLD中,"Hello, " "World!" 會被連接為 "Hello, World!"HELLO_WORLD 會被替換為 "Hello, World!" 字符串
/***********************************************************/

利用#將宏參數轉換成字符串的特性可以完成字符串的拼接:

#defien HELLO(a) "hello"#a/***********************************************************/
舉例:
HELLO(bye)會被替換為 "hellobye" 字符串HELLO(bye) 被轉換為 "hello""bye" 再轉換為 "hellobye"/***********************************************************/

重要事項

1. 在C或C++中的宏定義中,#運算符(被稱為“字符串化”)只能用于宏參數。這意味著#必須直接跟在參數名稱后面,不能有任何東西介于#和參數名稱之間。換句話說,你不能在#和參數名之間添加任何非空白的字符。

錯誤案例:

#define STRING(a) nihao##a
#define TOSTRING(a) #STRING(a)/*********************************************/這個案例似乎想將nihao與參數a進行拼接并轉換為字符串
但是#與參數之間不能存在其他字符,因此#操作符在此處其實是失效的
執行TOSTRING(a)等價于執行了STRING(a)
TOSTRING(a) 會被替換為 nihaoa, 編譯過程中會將nihaoa當作一個變量。因為#操作符的無效/*********************************************/

2. ##符號兩側的空格會被忽略

#define CONCAT1(a,b) a##b#define CONCAT2(a,b) a  ##  b/****************************************/CONCAT1(a,b) 與 CONCAT2(a,b) 都會被替換為ab變量/****************************************/

3.?##運算符還有一個特殊的作用,就是當它跟在一個逗號后面,并且其后面繼續跟隨如##__VA_ARGS__的類型參數為空時,預處理器就會消除這個逗號

_VA_ARGS__?是C語言預處理器定義的一個指示符,它代表了可變參數的列表。它主要用于宏的定義中,當你需要定義一個接收可變數量參數的宏時。

#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__ )/*****************************************************/上述宏如果被傳遞一個參數,例如 FOO( "Hello, world!" ),
則__VA_ARGS__為空,此時##會去掉前面的逗號,從而避免了語法錯誤。/******************************************************/

#__VA_ARGS__將會把__VA_ARGS__轉化為字符串。


#define DEBUG(...) ##__VA_ARGS__/*********************************************/DEBUG(ni, hao, a) 會被替換為 "ni, hao, a" 字符串/**********************************************/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715852.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715852.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715852.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python virtualenv創建虛擬環境

文章目錄 安裝virtualenv在當前目錄創建虛擬環境命令進入虛擬環境激活虛擬環境查看python版本退出虛擬環境 安裝virtualenv pip install virtualenv在當前目錄創建虛擬環境命令 python -m virtualenv venvPS E:\coding\bertopic> python -m virtualenv venv created virtu…

Linux:Nginx服務重寫功能

目錄 一、重寫功能 1.重寫功能作用 2.rewrite指令 if指令 return指令 set指令 break指令 3.rewrite標志 redirect標志 permanent標志 break標志 last標志 rewrite標志實驗 一、重寫功能 1.重寫功能作用 重寫功能(rewrite)用于實現URL的重寫,URL的重寫是非常有用…

LC打怪錄 283. moving zero

題目鏈接 力扣 class Solution:def moveZeroes(self, nums: List[int]) -> None:l0for r in range(len(nums)):if nums[r]:nums[l], nums[r] nums[r], nums[l]l 1return nums 方法一: 思路 雙指針 1. def moveZeroes(self, nums: List[int]) -> None: …

Stable Diffusion 3正式發布,旨在鞏固其在AI圖像領域相對于Sora和Gemini的領先地位

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

vue3 + vite 項目可以使用純Js開發嗎?

答案:可以 創建項目: 按照鏈接參考或者按官方: webstorm 創建vue3 vite 項目-CSDN博客 項目目錄 tsconfig.json 配置允許js allowJs指定是否編譯js文件,在任意文件當中,如果我們模塊使用js寫的,那么我們需要 將all…

地理空間分析15——Python在應急響應與地理空間分析中的創新應用

目錄 寫在開頭1.Python及其在地理空間分析中的應用地理空間數據處理庫地理空間數據可視化工具 2.應急響應中的Python應用實例2.1 災害風險評估2.2 實時數據分析與響應2.3資源優化分配 3 地震應急響應案例:利用Python進行數據分析3.1 背景介紹3.2 數據收集與處理3.3 …

鏈式插補 (MICE):彌合不完整數據分析的差距

導 讀 數據缺失可能會扭曲結果,降低統計功效,并且在某些情況下,導致估計有偏差,從而破壞從數據中得出的結論的可靠性。 處理缺失數據的傳統方法(例如剔除或均值插補)通常會引入自己的偏差或無法充分利用數…

機器學習:模型選擇和模型優化

進行數據處理之后,我們得到了x_train和y_train,我們就可以用來進行回歸或分類模型訓練啦~ 一、模型選擇 我們這里可能使用的是回歸模型(Regression),值得注意的是,回歸和分類不分家。分類是預測離散值&…

策略的更新、加載與同步

C語言的C庫提供了策略的更新、加載與同步的方法,這里引入多線程,達到區分讀寫任務(生產者——消費者 模型)的目的。 示例: /*brief check strategy to update, reload, synchronized to read(stoped by SIGINT)author…

Mysql標量子查詢

目錄 子查詢標量子查詢數據準備 子查詢 SQL語句中嵌套select語句,稱為嵌套查詢,又稱子查詢。 SELECT * FROM t1 WHERE column1 ( SELECT column1 FROM t2 ... );子查詢外部的語句可以是insert / update / delete / select 的任何一個&…

git的安裝、使用

文章目錄 安裝gitgit學習網站git初始配置具體配置信息 新建版本庫(倉庫)git的工作區域和文件狀態工作區域文件狀態git文件提交的基礎指令 git基礎指令1. 版本提交2. 分支創建3. 分支切換4. 分支合并(1) git merge(2) git rebase 5. 在git的提交樹上移動(…

Ps:銳化工具

銳化工具 Sharpen Tool可用于增強圖像局部區域的對比度,從而提高圖像的清晰度和細節,特別適用于提升照片的邊緣定義和紋理細節。 快捷鍵:無 ◆ ◆ ◆ 常用操作方法與技巧 1、如果直接在像素圖像上使用銳化工具,可嘗試使用“漸隱…

怎么優雅地訪問ChatGPT

ChatGPT,這顆璀璨的智能結晶,在2022年歲末之際,由OpenAI實驗室傾力鑄就,猶如夜空中躍動的智慧星辰,點亮了人工智能領域的新紀元。猶如汪洋中的一座燈塔,ChatGPT以其獨特的智慧光輝引人注目,然而…

Linux:kubernetes(k8s)node節點加入master主節點(3)

Linux:kubernetes(k8s)搭建mater節點(kubeadm,kubectl,kubelet)-CSDN博客https://blog.csdn.net/w14768855/article/details/136415575?spm1001.2014.3001.5502 我在上一章部署好了主節點&…

前端打包部署(黑馬學習筆記)

我們的前端工程開發好了,但是我們需要發布,那么如何發布呢?主要分為2步: 1.前端工程打包 2.通過nginx服務器發布前端工程 前端工程打包 接下來我們先來對前端工程進行打包 我們直接通過VS Code的NPM腳本中提供的build按鈕來完…

從下一代車規MCU厘清存儲器的發展(2)

目錄 1.概述 2.MCU大廠的選擇 2.1 瑞薩自研STT-MRAM 2.2 ST專注PCM 2.3 英飛凌和臺積電聯手RRAM 2.4 NXP如何計劃eNVM 3.小結 1.概述 上篇文章,我們簡述了當前主流的存儲器技術,現在我們來講講各大MCU大廠的技術選擇 2.MCU大廠的選擇 瑞薩日…

redis的RDB和AOF

Redis是一種高性能的鍵值對存儲系統,它支持多種類型的數據結構,如字符串、列表、集合、哈希表、有序集合等。Redis提供了兩種不同的持久化機制來確保數據的安全性:RDB(Redis Database)和AOF(Append Only Fi…

Tomcat布署及優化二-----Mysql和虛擬機

1.Mysql搭Blog 1.1下載安裝包 看一下tomcat狀態 1.2放到指定目錄 cp jpress-v3.2.1.war /usr/local/tomcat/webapps/ cd /usr/local/tomcat/webapps/ 1.3路徑優化 ln -s jpress-v3.2.1 jpress 看jpress權限 1.4生成配置文件 cat >/etc/yum.repos.d/mysql.repo <<E…

掘根寶典之C語言指針詳解

目錄 什么是指針&#xff1f; 與指針相關的運算符 指針類型的意義 指針的大小 初始化 將指針直接指向一個已經存在的變量或內存地址&#xff1a; 使用malloc函數動態分配內存&#xff0c;并將指針指向新分配的內存&#xff1a; 使用calloc函數動態分配內存&#xff0c;并…

Javascript:常量與數據類型

一、前言 介紹完變量之后我們來對常量進行了解一番&#xff0c;關于常量我們需要知道些什么呢&#xff1f; 二、正文 1.常量的基本使用 使用const聲明的變量稱為常量&#xff0c;當某個變量的字面量無需改動的時候就能夠用到常量。 //聲明一個常量 const G 9.8 //輸出這個常量…