C++如何在变量前面加#

 更新时间:2023年08月07日 15:01:16   作者:眼中皆星辰  
这篇文章主要介绍了C++如何在变量前面加#问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

C++中变量前面加#

C++中变量前面加#的作用为把变量字符串化。

看如下的几个例子

例1:代码如下

#include <iostream>
using namespace std;
#define operation(NAME) cout<<#NAME<<" = "<<NAME<<endl;
int main()
{
    int AB_CD=1;
    operation(AB_CD);
}

结果如下:

例2:代码如下

#include <iostream>
#include<string.h>
using namespace std;
#define operation(NAME) string a=#NAME;
int main()
{
    operation(AB_CD);
    cout << a << endl;
}

结果如下:

C++中#(一个#号)和##(两个#号)的用法和作用

关于一个#号

在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作, 简单说就是对他所引用的宏变量通过替换后再其左右各加上一个双引用。

例子:

# define WARNIF(EXP) \
do{ \
    if (EXP) \
    {    \    
        fprintf(stderr, "warning:" #EXP "\n"); \
    }   \    
}while(0)    

在实际使用中会出现下面所示的替换过程:

WARN_IF(div == 0); 被替换成以下代码
do{
    if (div == 0) 
    {        
        fprintf(stderr, "warning:" "div == 0" "\n"); 
    }       
}while(0)

关于两个#号

##被称为连接符,用来将两个Token链接成一个Token.注意这里的连接的对象时Token就行, 而不一定是宏的变量。比如你要做一个菜单项命令名和函数指针组成的结构体的数组,并且希望在函数和菜单项命令名直

接有直观的名字上的关系, 那么下面的代码就非常实用

struct command
{
    char *name;
    void (*function)(void);
};
#define COMMAND(NAME){NAME, NAME##_command}

然后就用一些预定义好的命令来方便的初始化一个command结构的数据了:

struct command commands[] = {
    COMMAND(quit),
    COMMAND(help),
    ...
}

COMMAND宏在这里充当一个代码生成器的作用,这样可以在一定程度上减少代码的密度, 间接的也可以减少粗心所造成的错误。

我们还可以n个##符号链接n+1个Token,这个特性也是#符号所不具备的。

例如:

#define LINK_MULTIPLE(a, b, c, d) a##_##b##_##c##_###d
typedef struct_record_type LINK_MULTIPLE(name, company, position, salary);
//展开内容为 : typedef struct_record_type name_company_position_salary;

关于...的使用

...在C语言中被称为变参宏 

#define myprintf(templt, ...)  fprintf(stderr, templt, ##__VA_ARGS__)

这是##这个连接符充当的作用就是当__VA_ARGS__为空的时候, 消除前面的那个逗号。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解C语言读取文件求某一列的平均值

    详解C语言读取文件求某一列的平均值

    本文粗浅比较了C语言中常用的几种读取文件的函数的效率,并给出了几段求取某列平均值的代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多度进步
    2022-02-02
  • 深入剖析C++中的struct结构体字节对齐

    深入剖析C++中的struct结构体字节对齐

    要求数据内存的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,本文就来深入剖析C++中的struct结构体字节对齐,需要的朋友可以参考下
    2016-05-05
  • c++重载的详细总结

    c++重载的详细总结

    作为成员函数重载符,对于双目操作符重载函数只需一个形参,对于单目操作符重载函数不需要形参
    2013-09-09
  • 关于C语言 const 和 define 区别

    关于C语言 const 和 define 区别

    这篇文章主要介绍了关于C语言 const 和 define 区别 的相关资料,需要的朋友可以参考下面文章内容
    2021-09-09
  • C++ qsort函数排序与冒泡模拟实现流程详解

    C++ qsort函数排序与冒泡模拟实现流程详解

    qsort是一个库函数,基于快速排序算法实现的一个排序的函数,下面这篇文章主要给大家介绍了关于C语言qsort()函数使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • C++ 如何使用RapidJson 写入文件

    C++ 如何使用RapidJson 写入文件

    RapidJSON 是只有头文件的 C++ 库, 不需要编译, 可以直接在项目中使用, 只需把 include/rapidjson 目录复制至系统或项目的 include 目录即可,下面给大家分享C++ 如何使用RapidJson 写入文件,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • C++链表类的封装详情介绍

    C++链表类的封装详情介绍

    这篇文章主要介绍了C++链表类的封装,文章基于C++的相关资料展开主题的详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • VS2022添加代码模板的实现步骤(图文)

    VS2022添加代码模板的实现步骤(图文)

    使用代码模板即可实现像内置函数那样,只需写几个字母,便能提示自动补全,本文主要介绍了VS2022添加代码模板的实现步骤,感兴趣的可以了解一下
    2024-06-06
  • C++虚函数表实例分析

    C++虚函数表实例分析

    这篇文章主要介绍了C++虚函数表,对多态中用到的虚函数表进行了比较通俗的实例分析,需要的朋友可以参考下
    2014-09-09
  • C语言实现简易扫雷游戏详解

    C语言实现简易扫雷游戏详解

    这篇文章主要为大家详细介绍了C语言实现简易扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论