你知道C语言中#和##表示的意义吗

 更新时间:2023年04月07日 08:59:48   作者:努力学习游泳的鱼  
如标题,这篇文章会讲解C语言中的#和##是啥意思。我相信,大部分朋友应该都没怎么用过,这两个玩意的使用条件也相当苛刻,快跟随小编一起来看看吧

如标题,这篇文章会讲解C语言中的#和##是啥意思。我相信,大部分朋友应该都没怎么用过,这两个玩意的使用条件相当苛刻。

#用于把一个宏参数直接转换为相应的字符串。

##用于连接2个标识符。

1.#

先做一个小铺垫。C语言中允许把一个字符串拆成2个字符串。比如,下面2条语句是等价的。

printf("Hello, world!!!\n");
printf("Hello, ""world!!!\n");

也就是说,可以把"Hello, world!!!\n"拆成"Hello, “和"world!!!\n”。

而#可以把一个宏参数直接转换成相应的字符串。比如有下面这个宏:

#define CONVERT(a) #a

如果在某个地方这样调用:

int test_convert = 10;
printf(CONVERT(test_convert));

在预处理之后,test_convert就会转换成相应的字符串,即"test_convert"。没错!直接把标识符作为文本转换成字符串!也就是说,上面2条语句会转换成这样:

int test_convert = 10;
printf("test_convert");

屏幕上就会打印出test_convert这个字符串。

那么,假设有这么一个宏:

#define PRINT_MESSEGE(data, format) \
        printf("The value of "#data" is "format".\n", data)

就很有意思了。结合上面的讲解,你猜猜下面的调用会输出什么?

int i = 10;
PRINT_MESSEGE(i, "%d");

double d = 3.14;
PRINT_MESSEGE(d, "%lf");

以PRINT_MESSEGE(i, "%d");为例。宏的第一个参数就是i,第二个参数就是"%d",具体就会替换成:printf("The value of ""i"" is ""%d"".\n", i)。根据前面讲解的字符串可以拆分的知识,这几个小的字符串也可以合并,就等价于:printf("The value of i is %d.\n", i)。所以输出结果就是:

2.##

##是用来连接2个标识符的。比如下面这个宏:

#define CAT(a, b) a##b

下面的代码就很有意思了:

int num5 = 20;
printf("%d\n", CAT(num, 5));

解释一下,a##b就是字面意思的把a和b连起来。比如,CAT(num, 5)就会被替换成num5,所以上面的2条语句就会被替换成:

int num5 = 20;
printf("%d\n", num5);

所以会输出20。

3.总结

1.#可以把对应的宏参数的文本直接替换成完全一模一样的字符串。比如#define CONVERT(name) #name这个宏,就会把变量a替换成字符串"a",变量num替换成字符串"num"。

2.##可以连接2个标识符。对于宏#define CAT(a, b) a##b,就是字面意思的把a和b的名字连起来,成为一个新的名字ab。比如CAT(num, 5)就会合成一个新的名字num5。

到此这篇关于你知道C语言中#和##表示的意义吗的文章就介绍到这了,更多相关C语言# ##内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • opencv帧差法找出相差大的图像

    opencv帧差法找出相差大的图像

    这篇文章主要为大家详细介绍了opencv帧差法找出相差大的图像,包含访问mat的像素值,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C语言简明清晰讲解枚举

    C语言简明清晰讲解枚举

    枚举法的本质就是从所有候选答案中去搜索正确的解,枚举算法简单粗暴,他暴力的枚举所有可能,尽可能地尝试所有的方法,感兴趣的朋友来看看吧
    2022-05-05
  • c++中std::placeholders的使用方法

    c++中std::placeholders的使用方法

    std::placeholders 是 C++ 标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • MFC Frame-Splitter模型实例原理解析

    MFC Frame-Splitter模型实例原理解析

    这篇文章主要介绍了MFC Frame-Splitter模型实例原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 深入剖析C语言中qsort函数的实现原理

    深入剖析C语言中qsort函数的实现原理

    这篇文章主要介绍了C语言中qsort函数的实现原理,本文将从回调函数,qsort函数的应用,qsort函数的实现原理三个方面进行讲解,并通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • C++基础之this指针与另一种“多态”

    C++基础之this指针与另一种“多态”

    this指针识别了同一个类的不同的对象,换句话说,this指针使得成员函数可以访问同一个类的不同对象。再深入一点,this指针使得成员函数会因为this指针的不同而访问到了不同的成员变量
    2013-07-07
  • C++实现中值滤波的示例代码

    C++实现中值滤波的示例代码

    本文主要介绍了C++实现中值滤波的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C语言 冒泡排序算法详解及实例

    C语言 冒泡排序算法详解及实例

    这篇文章主要介绍了C语言 冒泡排序算法详解及实例的相关资料,需要的朋友可以参考下
    2016-11-11
  • C++ stringstream格式化输出输入详情

    C++ stringstream格式化输出输入详情

    这篇文章主要介绍了C++ stringstream格式化输出输入,首先string str; cin>>str;遇到空格结束;于是乎产生了getline(),可与得到一行字符串;空格自动去掉,下面来看看文章的详细内容,需要的小伙伴可以参考一下
    2021-11-11
  • C++ auto类型说明符

    C++ auto类型说明符

    在C++11中引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。当然,auto变量必须有初始值,这样编译器才能推断其类型
    2016-03-03

最新评论