欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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ù)編譯看看宏展開(kāi)后是什么樣的?如用命令 gcc -E test_#.c -o preprocess_test 編譯后,我們看最后的代碼:

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

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

2, ## -- 連接兩個(gè)語(yǔ)句為一個(gè)語(yǔ)句

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

#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)); 在編譯的時(shí)候會(huì)出現(xiàn)錯(cuò)誤:

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

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

而有一種情況這個(gè) ## 可能不會(huì)是你想要的結(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,這樣編譯會(huì)出現(xiàn)什么問(wèn)題呢?

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

#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;
}

這樣就能正確展開(kāi),編譯成功。

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

相關(guān)文章

  • c語(yǔ)言中malloc、realloc與calloc 的區(qū)別以及聯(lián)系

    c語(yǔ)言中malloc、realloc與calloc 的區(qū)別以及聯(lián)系

    以下是對(duì)c語(yǔ)言中的malloc函數(shù),realloc函數(shù)與calloc函數(shù)的區(qū)別以及它們之間的聯(lián)系進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-08-08
  • C++實(shí)現(xiàn)大整數(shù)乘法

    C++實(shí)現(xiàn)大整數(shù)乘法

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)大整數(shù)乘法,使用笛卡爾相乘,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C++基礎(chǔ)概念講述

    C++基礎(chǔ)概念講述

    這篇文章主要介紹了C++基礎(chǔ)概念,??本次為C++的一個(gè)開(kāi)篇,重點(diǎn)是更好的理解C++相對(duì)于其他編程語(yǔ)言的一個(gè)特性,之后會(huì)持續(xù)更新,本次專(zhuān)欄計(jì)劃是掌握C++的基礎(chǔ)語(yǔ)法以及常用特性,并且從細(xì)節(jié)上去理解,需要的朋友可以參考一下
    2021-12-12
  • 指針與const限定符的使用分析

    指針與const限定符的使用分析

    本篇文章對(duì)指針與const限定符的使用進(jìn)行了分析介紹。需要的朋友參考下
    2013-05-05
  • C++ 情懷游戲貪吃蛇的實(shí)現(xiàn)流程詳解

    C++ 情懷游戲貪吃蛇的實(shí)現(xiàn)流程詳解

    貪吃蛇是曾經(jīng)諾基亞手機(jī)上很經(jīng)典很經(jīng)典的傳統(tǒng)老游戲,80.90后的童年時(shí)不多的游戲之一,跟電腦上的掃雷一樣,下面來(lái)從貪吃蛇手機(jī)游戲的前世今生講起
    2021-11-11
  • strcpy函數(shù)實(shí)現(xiàn)簡(jiǎn)示例命分享

    strcpy函數(shù)實(shí)現(xiàn)簡(jiǎn)示例命分享

    這篇文章主要介紹了strcpy函數(shù)實(shí)現(xiàn)簡(jiǎn)示例命,需要的朋友可以參考下
    2014-03-03
  • C++示例講解觀察者設(shè)計(jì)模式

    C++示例講解觀察者設(shè)計(jì)模式

    觀察者模式是極其重要的一個(gè)設(shè)計(jì)模式,也是我?guī)啄觊_(kāi)發(fā)過(guò)程中使用最多的設(shè)計(jì)模式,本文首先概述觀察者模式的基本概念和Demo實(shí)現(xiàn),接著是觀察者模式在C++中的應(yīng)用,最后是對(duì)觀察者模式的應(yīng)用場(chǎng)景和優(yōu)缺點(diǎn)進(jìn)行總結(jié)
    2022-12-12
  • C++ CopyFile,MoveFile用法案例詳解

    C++ CopyFile,MoveFile用法案例詳解

    這篇文章主要介紹了C++ CopyFile,MoveFile用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 簡(jiǎn)介C++編程中的運(yùn)算符重載

    簡(jiǎn)介C++編程中的運(yùn)算符重載

    這篇文章簡(jiǎn)單介紹了C++編程中的運(yùn)算符重載,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C++?引用與內(nèi)聯(lián)函數(shù)詳情

    C++?引用與內(nèi)聯(lián)函數(shù)詳情

    這篇文章主要介紹了C++?引用與內(nèi)聯(lián)函數(shù)詳情,主要分享一下關(guān)于引用的知識(shí)點(diǎn),這里都是一些比較基礎(chǔ)的知識(shí),適合初學(xué)者,下文續(xù)航徐介紹需要的小伙伴可以參考一下
    2022-05-05

最新評(píng)論