最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析C++宏定義里#和##的使用

 更新時間:2023年05月18日 09:20:00   作者:愛跑步的碼農(nóng)  
工作中如果是c開發(fā)的話,經(jīng)常會用到宏定義,而宏定義中的#和##也會時不時遇到,本文主要就來和大家分享一下這兩個符號的作用,需要的可以參考一下

工作中如果是c開發(fā)的話,經(jīng)常會用到宏定義,而宏定義中的#和##也會時不時遇到,今天分享這兩個符號的作用。

1,# -- 轉(zhuǎn)換成字符串

直接看例子:

#include <stdio.h>
#include <stdlib.h>
#define VAL2STR(VAL) (#VAL) 
#define fun_call_rt(func)		\
do								\
{								\
	int ret = func;				\
	if(ret){printf("%d = %s\n", ret, #func);} \
} while (0);
int func_for_test(int value);
int main()
{
	int val = 200;
	printf("%s\n", VAL2STR(200));
	fun_call_rt(func_for_test(10));
	return 0;
}
int func_for_test(int value)
{
	if(value == 100)
	{
		return 0;
	}
	else
	{
		return -1;
	}
}

我們可以直接用gcc -E 預(yù)編譯看看宏展開后是什么樣的?如用命令 gcc -E test_#.c -o preprocess_test 編譯后,我們看最后的代碼:

其中的  VAL2STR(200) 被替換成了 ("200"),fun_call_rt(func) 中的 #func 被替換成了 "func_for_test(10)",即都被替換成了字符串,在c語言中應(yīng)該稱為字符數(shù)組類型。

在一些公司中類似 fun_call_rt(func) 宏幾乎處處可見,在每個函數(shù)調(diào)用的地方都是這個宏括起來,一旦有錯誤發(fā)生,打印輸出一目了然。

2, ## -- 連接兩個語句為一個語句

這里所說的語句,可以是函數(shù)名,類型名,變量名,但都需要有實(shí)際意義,否則就會編譯不過,看代碼:

#include <stdio.h>
#include <stdlib.h>
#define NAME_JOIN(x,y) x##y
int func_for_test_1();
int main()
{
	printf("%p\n", NAME_JOIN(func_for_test, _1));
	return 0;
}
int func_for_test_1()
{
	return 10;
}

假如我改成 printf("%p\n", NAME_JOIN(func_for_test1, _1)); 在編譯的時候會出現(xiàn)錯誤:

因為 NAME_JOIN(func_for_test1, _1) 只是簡單的把兩個短語連接為一個短語,而連接后的這個短語是否有效那就要做語法檢測了,如上面執(zhí)行的結(jié)果為:打印函數(shù)的地址

那如果改成這樣:printf("ret = %d\n", NAME_JOIN(func_for_test, _1)()); 就是一個函數(shù)調(diào)用了,其結(jié)果就是:

而有一種情況這個 ## 可能不會是你想要的結(jié)果,那就是宏定義里又包含宏定義,如:

#include <stdio.h>
#include <stdlib.h>
#define NUMBER_1 _1
//#define NAME_JOIN(x,y) NAME_JOIN2(x,y)
#define NAME_JOIN(x,y) x##y
int func_for_test(int value);
int func_for_test_1();
int main()
{
        printf("ret = %d\n", NAME_JOIN(func_for_test, NUMBER_1)());
        return 0;
}
int func_for_test_1()
{
        return 10;
}

NAME_JOIN(func_for_test, NUMBER_1) 宏定義里又包含了宏 NUMBER_1,這樣編譯會出現(xiàn)什么問題呢?

可以看到  NUMBER_1 沒有被展開,我們想要的是它被展開為 -1,即 func_for_test_1。處理辦法就是再多加一個宏定義,如:

#include <stdio.h>
#include <stdlib.h>
#define NUMBER_1 _1
#define NAME_JOIN(x,y) NAME_JOIN2(x,y)
#define NAME_JOIN2(x,y) x##y
int func_for_test(int value);
int func_for_test_1();
int main()
{
        printf("ret = %d\n", NAME_JOIN(func_for_test, NUMBER_1)());
        return 0;
}
int func_for_test_1()
{
        return 10;
}

這樣就能正確展開,編譯成功。

以上就是淺析C++宏定義里#和##的使用的詳細(xì)內(nèi)容,更多關(guān)于C++宏定義的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺談VC++中的內(nèi)聯(lián)

    淺談VC++中的內(nèi)聯(lián)

    在 Visual C++ 中使用內(nèi)聯(lián)匯編 一、內(nèi)聯(lián)匯編的優(yōu)缺點(diǎn) 因為在Visual C++中使用內(nèi)聯(lián)匯編不需要額外的編譯器和聯(lián)接器,且可以處理Visual C++ 中不能處理的一些事情,而且可以使用在 C/C++中的變量,所以非常方便。
    2015-07-07
  • C/C++舉例講解關(guān)鍵字的用法

    C/C++舉例講解關(guān)鍵字的用法

    相對于其他語言來說,C語言的關(guān)鍵字算是少的了。在C98中關(guān)鍵子總共只有32個,我們來分析一下部分關(guān)鍵字在C/C++中它獨(dú)特的作用
    2022-05-05
  • C++ min/max_element 函數(shù)用法詳解

    C++ min/max_element 函數(shù)用法詳解

    這篇文章主要介紹了C++ min/max_element 函數(shù)用法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含義說明

    C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含義說明

    這篇文章主要介紹了C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含義說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • win10+VS2017+Cuda10.0環(huán)境配置詳解

    win10+VS2017+Cuda10.0環(huán)境配置詳解

    這篇文章主要介紹了win10+VS2017+Cuda10.0環(huán)境配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • C語言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用鏈表

    C語言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用鏈表

    這篇文章主要為大家詳細(xì)介紹了c語言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Objective-C不帶加減號的方法實(shí)例

    Objective-C不帶加減號的方法實(shí)例

    顯而易見的事實(shí)是,Objective-C 中,+ 表示類方法,- 表示實(shí)例方法,這篇文章主要給大家介紹了關(guān)于Objective-C不帶加減號的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • 進(jìn)程間通信之深入消息隊列的詳解

    進(jìn)程間通信之深入消息隊列的詳解

    本篇文章是對消息隊列的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言學(xué)習(xí)筆記之VS2022安裝使用教程

    C語言學(xué)習(xí)筆記之VS2022安裝使用教程

    這篇文章主要介紹了C語言學(xué)習(xí)筆記之VS2022安裝使用教程,在VS2022中,在使用scanf函數(shù)編譯出錯,本文給大家提到了解決方法,需要的朋友可以參考下
    2022-05-05
  • 淺析C++淺拷貝與深拷貝的聯(lián)系和區(qū)別

    淺析C++淺拷貝與深拷貝的聯(lián)系和區(qū)別

    在c++中,深拷貝和淺拷貝也算是一個難點(diǎn),特別是對于初學(xué)者來說,往往在不知道兩者區(qū)別的情況下而錯誤的使用了淺拷貝,從而導(dǎo)致了野指針之類的問題,但是又因為缺少理解所以很難定位到問題所在
    2022-09-09

最新評論

隆尧县| 巴南区| 邢台市| 乐亭县| 冀州市| 临潭县| 安泽县| 田东县| 广水市| 新闻| 齐河县| 邯郸县| 界首市| 上栗县| 孟津县| 河津市| 克山县| 嘉义县| 阿图什市| 日照市| 莱芜市| 鸡东县| 亚东县| 利川市| 南皮县| 娄底市| 武功县| 克山县| 利辛县| 江油市| 稷山县| 新河县| 班戈县| 海安县| 方山县| 肥乡县| 洛南县| 饶平县| 项城市| 嘉兴市| 锦屏县|