C語言中的#和##操作符用法

C語言中#和##操作符用法

答:在C語言中,###是預處理器(preprocessor)的操作符,主要用于宏(macro)的定義中。這兩個操作符提供了字符串化和字符串連接的功能。

#操作符

#操作符用于將其后的宏參數轉換為一個字符串字面量,在編譯時將宏參數轉換為字符串。

下面根據一個簡單的示例分析一下。

#include <stdio.h>#define STRINGIFY(str) #strint main(void)
{printf("STRINGIFY(hello)=%s\n", STRINGIFY(hello));return 0;
}

執行如下預處理命令:

gcc -E main.c -o main.i

查看main.i文件,可以發現確實將宏轉換為了字符串:

...
# 5 "main.c"
int main(void)
{printf("STRINGIFY(hello)=%s\n", "hello");return 0;
}

編譯成可執行文件,運行測試:

$ gcc main.c -o main
$ ./main 
STRINGIFY(hello)=hello

##操作符

##操作符將兩個標識符連接在一起,在編譯時進行標識符連接。

下面根據一個簡單的示例分析一下。

#include <stdio.h>#define CONCAT(x, y) x##yint main(void)
{int ab = 1;printf("CONCAT(a,b)=%d\n", CONCAT(a,b));return 0;
}

執行如下預處理命令:

gcc -E main.c -o main.i

查看main.i文件,可以發現確實將宏參數進行了連接:

...
# 5 "main.c"
int main(void)
{int ab = 1;printf("CONCAT(a,b)=%d\n", ab);return 0;
}

編譯成可執行文件,運行測試:

$ gcc main.c -o main
$ ./main 
CONCAT(a,b)=1

注意

如果宏參數也是另外一個宏時,比如上面的str或者xy也是定義的一個宏:

#include <stdio.h>#define STRINGIFY(str) #str
#define CONCAT(x, y) x##y#define HELLO hello
#define A   a
#define B   bint main(void)
{int ab = 1;printf("STRINGIFY(hello)=%s\n", STRINGIFY(HELLO));printf("CONCAT(a,b)=%d\n", CONCAT(A,B));return 0;
}

上面STRINGIFY(HELLO)就直接展開為大寫字符串HELLO,而 CONCAT(A,B)會被展開為AB,導致編譯失敗,找不到變量AB,這就說明當宏參數是另一個宏的時候,宏定義里有用###的地方宏參數是不會再展開。

...
# 10 "main.c"
int main(void)
{int ab = 1;printf("STRINGIFY(hello)=%s\n", "HELLO");printf("CONCAT(a,b)=%d\n", AB);return 0;
}

解決辦法是再定義一層中間轉換宏,保證所有的宏參數在這個轉換宏中展開,如下:

#include <stdio.h>#define _STRINGIFY(str) #str
#define STRINGIFY(str) _STRINGIFY(str)#define _CONCAT(x, y) x##y
#define CONCAT(x, y) _CONCAT(x, y)#define HELLO hello
#define A   a
#define B   bint main(void)
{int ab = 1;printf("STRINGIFY(hello)=%s\n", STRINGIFY(HELLO));printf("CONCAT(a,b)=%d\n", CONCAT(A,B));return 0;
}

編譯預處理即可按照期望進行展開:

...
# 13 "main.c"
int main(void)
{int ab = 1;printf("STRINGIFY(hello)=%s\n", "hello");printf("CONCAT(a,b)=%d\n", ab);return 0;
}

編譯成可執行文件,運行測試:

$ gcc main.c -o main
$ ./main 
STRINGIFY(hello)=hello
CONCAT(a,b)=1

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

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

相關文章

算法人生(19): 從“LangChain的六大組件”看“個人職業規劃”

我們今天要說說和大模型有著密切關系的Langchain &#xff0c;它提供了一個平臺&#xff0c;讓開發者可以更加輕松地訓練、部署和管理這些大模型。具體來說&#xff0c;Langchain 可以通過提供高性能的計算資源、靈活的模型管理和部署選項、以及豐富的監控和調試功能&#xff0…

Python語言試卷:深入剖析Python編程的精髓

Python語言試卷&#xff1a;深入剖析Python編程的精髓 在編程的世界里&#xff0c;Python以其簡潔、易讀和強大的功能贏得了眾多開發者的青睞。為了全面檢驗大家對Python語言的理解程度&#xff0c;本試卷將從四個方面、五個方面、六個方面和七個方面展開深入剖析&#xff0c;…

企業軟件產品和服務 之 設計保證安全 七項承諾

1. 引言 公司如何保護自己免受數據泄露的影響&#xff1f;標準答案就是&#xff1a; “啟用多因素身份驗證”——MTA&#xff08;Enable multifactor authentication&#xff09;。 但是&#xff0c;目前很多公司仍然盲目地只使用密碼作為唯一的身份來源。 網絡安全的核心是…

Python怎么定義類:深入探索與實戰解析

Python怎么定義類&#xff1a;深入探索與實戰解析 在Python編程的廣闊天地中&#xff0c;定義類是一項基礎且至關重要的技能。類作為面向對象編程的核心構造&#xff0c;為我們提供了一種組織和封裝代碼、創建可重用對象的方式。今天&#xff0c;我們將從四個方面、五個方面、…

【分享】兩種方法設置PDF“打開密碼”

想要保護PDF文件的私密性&#xff0c;只允許特定人查看&#xff0c;我們可以給PDF設置“打開密碼”&#xff0c;這樣只有知道密碼的人才可以打開文件。如果小伙伴們不知道如何設置&#xff0c;就一起看看以下兩種方法吧&#xff01; 方法1&#xff1a;使用PDF編輯器 大部分PD…

Leetcode:羅馬數字轉整數

題目鏈接&#xff1a;13. 羅馬數字轉整數 - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;模擬&#xff09; 分析&#xff1a;通常情況下&#xff0c;羅馬數字中小的數字在大的數字的右邊。若輸入的字符串滿足該情況&#xff0c;累加每個字符對應的數值即可&am…

HarmonyOS(二十四)——Harmonyos通用事件之觸摸事件

1.觸摸事件。 觸摸事件是HarmonyOS通用事件的一種事件之一&#xff0c;當手指在組件上按下、滑動、抬起時觸發。 名稱是否冒泡功能描述onTouch(event: (event?: TouchEvent) > void)是手指觸摸動作觸發該回調&#xff0c;event返回值見下面TouchEvent介紹。 2. TouchEve…

埃隆·馬斯克 - 從夢想家到改變世界的企業家

埃隆馬斯克 - 從夢想家到改變世界的企業家 本文內容是埃隆馬斯克傳的重點章節精華提煉&#xff0c;介紹了馬斯克傳奇一生 參考資料內容&#xff1a;埃隆馬斯克傳&造夢者埃隆馬斯克 參考資料在文末獲取&#xff0c;關注我&#xff0c;分享優質前沿資料&#xff08;IT、運…

交互設計專業解析:發展前景和薪資待遇

交互式設計專業是一門旨在幫助人們更好地與數字產品和服務互動的設計學科。交互式設計專業涉及人機交互、用戶體驗設計、用戶界面設計等多個不同領域。交互式設計是當今數字時代不可缺少的一部分。它能為用戶提供更好的體驗和更高效的功能&#xff0c;為企業創造更高的價值和影…

LabVIEW儲油罐監控系統

LabVIEW儲油罐監控系統 介紹了基于LabVIEW的儲油罐監控系統的設計與實施。系統通過集成傳感器技術和虛擬儀器技術&#xff0c;實現對儲油罐內液位和溫度的實時監控&#xff0c;提高了油罐監管的數字化和智能化水平&#xff0c;有效增強了油庫安全管理的能力。 項目背景 隨著…

買賣股票的各種最佳時機問題

買賣股票的最佳時機 分析 根據題意可知&#xff0c;我們只需要找出來一個最小價格的股票和一個最大價格的股票&#xff0c;并且最小價格的股票出現在最大價格的股票之前。 如果嘗試使用暴力解法&#xff0c;時間復雜度為O(N^2)&#xff0c;對于題目中給的長度&#xff0c;顯然…

金士頓U盤被寫保護的解決方法

1.適用的U盤芯片信息 USB設備ID: VID 0951 PID 1666 設備供應商: Kingston 設備名稱: DataTraveler 3.0 設備修訂版: 0110 產品制造商: Kingston 產品型號: DataTraveler 3.0 產品修訂版: PMAP 主控廠商: Phison(群聯) 主控型號: PS2251-07(PS2307) - F/W 08.03.50 [2018-…

從學士-碩士-博士-博士后-副教授-教授-優青-杰青-長江-院士:一文看懂學術巨人的成長歷程

會議之眼 快訊 學術之路&#xff0c;如同攀登一座高聳入云的山峰&#xff0c;需要毅力、智慧和不斷的求知探索。從奠定基礎的學士&#xff0c;到站在學術巔峰的院士。這條成長之路充滿了挑戰和機遇。 如果把學術界比作王者榮耀&#xff0c;那么學者們的成長歷程就像是在進行一…

SpringBoot-SchedulingConfigurer源碼初識:理解定時任務拋異常終止本次調度,但不會影響下一次執行調度

SchedulingConfigurer源碼初識&#xff1a;理解定時任務拋異常終止本次調度&#xff0c;但不會影響下一次執行調度 EnableSchedulingScheduledAnnotationBeanPostProcessor進入finishRegistration方法 ScheduledTaskRegistrar處理觸發器任務&#xff08;TriggerTask&#xff09…

F5G城市光網,助力“一網通城”筑基數字中國

《淮南子》中說&#xff0c;“臨河而羨魚&#xff0c;不如歸家織網”。 這句話在后世比喻為做任何事情都需要提前做好準備&#xff0c;有了合適的工具&#xff0c;牢固的基礎&#xff0c;各種難題也會迎刃而解。 如今&#xff0c;數字中國發展建設如火如荼&#xff0c;各項任務…

訓練營第二十七天 | 491.遞增子序列46.全排列47.全排列 II332.重新安排行程51. N皇后

491.遞增子序列 力扣題目鏈接(opens new window) 給定一個整型數組, 你的任務是找到所有該數組的遞增子序列&#xff0c;遞增子序列的長度至少是2。 示例: 輸入: [4, 6, 7, 7]輸出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]] 說明: …

S4 BP 常用tcode

FLBPD1 - 從客戶創建業務伙伴 FLBPC1 - 從供應商處創建業務合作伙伴 FLBPD2 - 將業務伙伴鏈接到客戶 FLBPC2 - 業務合作伙伴到供應商的鏈接 CVI_CUSTOMIZING_CHK - 事務 CVI_CUSTOMIZING_CHK CVI_PRECHK - 事務 CVI_PRECHK CVI_COCKPIT - 事務 CVI_COCKPIT MDS_LINKS - …

Python腳本自動填充數據和生成文檔輕松辦公

一&#xff0c;自動填充數據生成word文檔 代碼&#xff1a; from docx import Document# 創建一個新的Word文檔對象 doc Document()# 添加標題 doc.add_heading(自動填充數據和生成文檔, level1)# 添加段落 doc.add_paragraph(這是一個使用Python腳本自動填充數據并生成文檔的…

刷新方盒子最快10萬銷量紀錄 捷途旅行者何以顛覆越野市場?

近年”方盒子“產品迅速崛起&#xff0c;在新一輪的市場角逐中&#xff0c;率先突圍的并非傳統豪強&#xff0c;而是首次進軍越野市場的捷途汽車。作為“燃油車&#xff0c;”捷途旅行者&#xff0c;在面對純電、混動等產品的強勢圍剿下&#xff0c;僅用時9個月便成為細分市場銷…

基于細節增強卷積和內容引導注意的單圖像去霧

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 摘要Abstract文獻閱讀&#xff1a;DEA-Net&#xff1a;基于細節增強卷積和內容引導注意的單圖像去霧1、研究背景2、方法提出3、相關知識3.1、DEConv3.3、多重卷積的…