c语言宏定义中的#和##

小知识:C语言宏定义中 # 和 ## 符号的用法 在某些C语言代码中,有时我们可能会看到宏定义中带有#、##,这些符号有特殊的作用,下面我们用几个简单的例子来说明。 1)一个#的作用 一个#的作用就是把后面的参数当做一个字符串,也就是说等同于把后面的宏变量加上双引号: 运行上述代码,可以得到输出: Hello world 1 Hello world 2 说明 #define PRINT(NAME) printf(#NAME)这个宏,等同于把NAME加上了双引号“”,即替换成了“NAME”,所以,第一个PRINT可以直接把括号内的内容.. 阅读详情

众所周知宏定义是在编译器预处理阶段进行的语法替换,发生在编译之前。

“##”是一个连接符号,用于把参数连在一起
“#”是“字符串化”的意思。出现在宏定义中的”#”是把跟在后面的参数转换成一个字符串

int v5 = 5;
#define f(n) printf("v "#n" = %d\n", v##n)
f(5); //输出:v 5 = 5
//define.c

#include <stdio.h>

#define FUNC_STOP stop

int player_stop()
{
    return 0;
}

int player_start()
{
    return 2;
}

int player_resume()
{
    return 3;
}

int player_play_1x()
{
    return 4;
}

typedef struct
{
    int (*stop)();
    int (*start)();
    int (*resume)();
    int (*play_1x)();
}PLAYER;

int main()
{
    PLAYER player;
#define SET(x) \
    printf("set %s\n", #x); \
    player.x = player_##x
#define SSET(x) \
    SET(x)

    //SET(stop);
    /*注意下面这行语句*/
    SSET(FUNC_STOP);
    SET(start);
    SET(resume);
    SET(play_1x);

    printf("%d %d %d %d\n", player.stop(), 
    player.start(), player.resume(), player.play_1x()); 
    return 0;
}
C语言中的宏定义:#和##的妙用 在C语言中,#和##操作符是宏定义中常用的两个操作符。#操作符可以将宏参数转换为字符串,而##操作符可以将两个标识符连接在一起形成一个新的标识符。在上述示例中,宏定义CONCATENATE(num, 1)将num和1连接在一起形成一个新的标识符num1,同样,CONCATENATE(num, 2)将num和2连接在一起形成一个新的标识符num2。其中,#和##操作符是宏定义中常用的两个操作符,它们可以让宏定义更加灵活和强大。在这个宏定义中,x和y是两个标识符,##操作符将它们连接在一起形成一个新的标识符。 阅读详情

相关推荐

北航机器学习2020-2021秋季学期期末试题回忆

北航机器学习2020-2021秋季学习期末试题回忆 fanjn, zhangyy, yuanq, wanggq, weixy, anh, wangyy, zhouxy, likc1 【注:考试使用纯白的A3答题纸,考试时间2h,各位同学可以自行模拟考试】 此试卷1-8题为10分,第9题为20分 1.2077年人类发射近地卫星,一共发射800颗,根据大小和轨道远近,有着不同的宜居条件(+表示宜居),有以下表格(数字八九不离十,其他属性什么的原题就是交替的) 数量 大小 轨道 是否宜居 30

weixin_45262065的博客 7608

C语言宏定义小结

转自:http://blog.21ic.com/user1/69/archives/2006/13695.html 宏中"#"和"##"的用法 1、一般用法  使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起。 2、当宏参数是另一个宏的时候 凡宏定义里有用#或##的地方宏参数是不会再展开。  更多的详细用法,请参见原作者博客。  下面附上Op

lxiaoxiaot的专栏 982

S-function入门及案例详解(3)——S-function进阶案例

目录1.案例描述2.案例详解3.输出波形4.对输入参数进行Mask打包 1.案例描述 设计一个蹦极系统 h为离地面高度,输入参数为长度、质量、离地面高度。 2.案例详解 步骤1.可以修改sfuntmpl函数的名称(这里修改为bengji),并在括号内增加输入参数 参数len,weight,dist分别表示长度、质量、离地面高度;长度用来初始化x0,质量用来初始化m,离地面高度用来初始化h。 function [sys,x0,str,ts,simStateCompliance] = bengji(t,x,u

Wendy的博客 1万+

C语言宏定义中的 # 和 ## 详细解释

C语言宏定义中的 # 和 ## 详细解释字符串化运算符#记号粘贴运算符 字符串化运算符# 一元运算符 # 常称为字符串化运算符(stringify operator 或 stringizing operator),因为它会把宏调用时的实参转换为字符串。# 的操作数必须是宏替换文本中的形参。当形参名称出现在替换文本中,并且具有前缀 # 字符时,预处理器会把与该形参对应的实参放到一对双引号中,形成一个字符串字面量。 实参中的所有字符本身维持不变,但下面几种情况是例外: (1) 在实参各记号之间如果存在有空白符序

菜鸟的晋级之路 5315

机器学习(三) ----------线性回归算法(梯度下降+正则化)

线性回归算法在机器学习中具有核心地位,它以其简单性和直观性为基础,为理解数据间的关系提供了基本框架。作为许多复杂算法的基础,线性回归不仅用于预测目标变量,还用于解释自变量对目标的影响。同时,它也是机器学习入门的经典算法,对于推广机器学习知识和技术具有重要意义。

2301_77539454的博客 1865

图神经网络实战——利用节点回归预测网络流量

在机器学习中,回归指的是对连续值的预测。通常与分类形成鲜明对比,分类的目标是找到正确的类别(即离散值,而非连续值)。在图数据中,分类和回归分别对应于节点分类和节点回归。在本节中,我们将尝试预测每个节点的连续值,而非分类变量。

盼小辉丶的博客 1万+

C语言中宏定义中的#和##

C语言中宏定义中#和##中作用 在宏定义中#和##的作用是:前者将宏定义的变量转化为字符串;后者将其前后的两个宏定义中的两个变量无缝拼接在一起。 1.   #: 在宏定义中,将其后的变量,转化为字符串。     eg:  #define  str(s)      #s   输出: helloworld , 就可以通过这样的的调用, printf( str(helloworld) )

wzb56的资料库 1645

get_ccopt系列命令介绍

get_ccopt_property:用来获取cts阶段,clock tree上所有的参数信息,可以通过get_ccopt_property –help *获取所有参数。get_ccopt_skew_group_delay:用来获取skew group的相关信息,可以通过筛选出特定条件下skew_group的参数,如skew_group下latency最长是多少;get_ccopt_clock_tree_source_groups:获取clock tree的source group名字;

芯冰乐 280

c语言中宏定义作用,C语言宏定义中的#和##的作用【转】

在宏定义中#和##的作用是:前者将宏定义的变量转化为字符串;后者将其前后的两个宏定义中的两个变量无缝拼接在一起转化为字符串。1. #: 在宏定义中,将其后的变量,转化为字符串。eg: #define str(s) #s输出: helloworld , 就可以通过这样的的调用, printf( str(helloworld) );2. ## : 在宏定义中,将其前后的两个变量拼接在...

weixin_39609650的博客 1170

14、5G物理层的灵活解决方案:广义频分复用(GFDM)

广义频分复用(GFDM)作为一种高度灵活的5G物理层多载波调制方案,能够满足多样化应用场景的需求,包括高吞吐量的比特管道通信、低功耗高连接数的物联网、超低延迟的触觉互联网以及广覆盖的无线区域网。通过参数化配置,GFDM可适配LTE资源网格,实现与现有系统的兼容与共存。其支持多种解调方式、干扰消除技术、OQAM映射及预编码机制,兼具低带外发射、高频谱效率和强鲁棒性。GFDM还能统一描述OFDM、FBMC、FTN等多种经典与先进波形,成为5G及未来通信系统中极具潜力的通用波形框架。

gold8的专栏 108

RTCA DO-160G标准详解:航空电子设备的全面环境适应性测试指南

第二章的主要目的是提供标准中使用的术语和定义。了解这些术语对于准确理解标准的要求至关重要,特别是在技术实施过程中。RTCA DO-160G 涉及多个学科的知识,包括航空、电子、电磁学和机械工程,因此需要确保使用的术语在所有学科中具有一致的定义。为了确保测试人员和工程师在执行测试时对所有条件和要求的理解一致,RTCA DO-160G 标准中定义了大量术语。环境应力:指的是设备在操作过程中可能遇到的外部物理或化学条件,包括温度、湿度、振动等。电磁干扰(EMI)

qq_41854911的博客 5276

C语言宏定义-#和##在宏定义中的作用

C语言宏定义-’#,##'在宏定义中的作用 1. 宏# #的作用是把宏的标识符进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号 /** * @def CMO_STRINGIFY * @brief converts a macro argument into a character constant. * * @param[in] x - A macro argument to stringify. */ #define CMO_ST

vvvlan的博客 1198

SAP FICO CBS接口-银企直连付款平台功能开发说明书(包括测试样例、FS)

SAP FICO CBS接口-银企直连付款平台功能开发说明书(包括测试样例、FS)

我好像病了的博客 2447

c语言相邻字符串字面量,宏定义中的运算符:#和##

宏定义可以包含两个运算符:#和##。编译器不会识别这两种运算符相反,它们会在预处理时被执行。#运算符将一个宏的参数转换为字符串字面量。它仅允许出现在带参数的宏的替换列表中。(一些C程序员将#操作理解为“stringization(字符串化)”;其他人则认为这实在是对英语的滥用。)#运算符有大量的用途,这里只来讨论其中的一种。假设我们决定在调试过程中使用PRINT_INT宏作为一个便捷的方法,来输出...

weixin_39701735的博客 280

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

python展开 c函数中的宏预处理_【C语言】关于宏定义中#和##符号的使用和宏定义展开问题...

有一道经典的C语言问题,关于宏定义中#和##符号的使用和宏定义展开问题程序如下:#include #define f(a,b) a##b#define g(a) #a#define h(a) g(a)int main(){printf("%s\n", h(f(1,2)));printf("%s\n", g(f(1,2)));return 0;}答案:第一行:12 第二行:f(1,2)说明:1...

weixin_39909366的博客 277

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C语言宏定义中的#和##

的功能是将其后面的宏参数进行字符串化操作,简单说就是替换后在其左右各加上一个双引号。printfEXP例如,PRINT(aaa)实际使用被替换为##被称为连接符,用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定 是宏的变量。那么,下面语句。

qq_43248127的博客 466

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C语言宏定义中的#和##的作用【转】

本文转载自:http://my.oschina.net/shelllife/blog/123202 在宏定义中#和##的作用是:前者将宏定义的变量转化为字符串;后者将其前后的两个宏定义中的两个变量无缝拼接在一起转化为字符串。 1. #: 在宏定义中,将其后的变量,转化为字符串。 eg: #define str(s) #s 输出: helloworld , 就可...

weixin_30387339的博客 95

C语言宏定义函数中的#和##

在C语言中,经常通过宏定义#define来定义一些常量或者函数。 1、对于常量定义,如: #define MAX_BUF 1024 #define NAME "whisper" 会在宏展开的时候,将所有MAX_BUF处替换为1024. 2、对于宏定义的函数,如: #define max(a,b) ((a > b)?a,b) #define ma...

Whisper_J的专栏 694

连字符 c语言,宏定义中的连接符##和#

1. C语言宏定义中的##用来连接符号可以用##来连接宏定义中的一个或多个变量。如#define file_open(filename_tag, filename, mode) \FILE *filename_tag = fopen(filename, stdio_file_open_##mode)file_open(game_config_...

weixin_42372963的博客 1980

C语言中##和#在宏定义中的用法

C语言的宏定义由于其特殊性具有特别高的可玩性,本篇文章介绍在宏定义中##和#的意义和用法。

m0_61195936的博客 418

C语言宏定义中的#和##符号

单井号就是将后面的 宏参数 进行字符串操作,就是将后面的参数用双引号引起来 双井号就是用于连接。

flyapy 514

C语言宏定义中的 “#” 和 “##”

#include <stdio.h> // #(stringizing) 字符串化操作符。 // 作用:将宏定义中的传入参数名转换成用一对双引号括起来的参数名字符串。 // 其只能用于有参数传入的宏定义中,且必须置于宏定义参数名前面。 // 对空格的处理: // 1. 忽略传入参数名前后的空格; // 2. 当传入参数名的中间存在空格时,编译器会自动连接各子字符串, // 且每个子字符串中只以一个空格连接,忽略多余一个的空格。 #define EXP(x) printf(".

记录自己工作生活中遇到的问题 1873

C语言宏定义中的连接符#和##

c语言宏定义的连接符有哪些 (一)宏定义中的## 连接符与# 符            ## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。同时值得注意的是#符是把传递过来的参数当成字符

Jason_351的专栏 935
上一篇: c语言中的"诡异"
下一篇: object-c学习 - object-c和c的布尔类型
codingnote
博客等级 码龄12年 3粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值