c语言 宏替换的顺序

C/C++宏的替换顺序[整理总结] 关于宏替换的顺序 看过csdn50楼的帖子 :      http://topic.youkuaiyun.com/u/20090727/18/457c61bd-7461-431c-bbf9-924865cfe43c.html 之后的 总结   总结:      不管书写的代码是不是跨平台的,当替换路径中出现  operator#  与 operator## 时, 替换的次序可能会不会 阅读详情

宏替换顺序,这是以前在论坛里看到的一个问题,因此整理下来供自己学习和参考,测试程序hello.c:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
  
#define _ToStr(x) #x 
#define __ToStr(x) _ToStr(x) 
#define Japan_EarthQuake 9.0 
  
int main() 
{ 
    printf("_ToStr:%s\n",_ToStr(Japan_EarthQuake); 
    printf("__ToStr():%s\n",__ToStr(Japan_EarthQuake); 
    return 0; 
}

在mingw下编译得到hello.out,运行后得到结果如下:

定义两层的原因是(传入的参数可能是宏也可能是普通字符串):

(1)预处理顺序:总是先将" "内的东西识别为字符串,再进行宏替换或宏参数替换,即" "内的宏名或宏参数名不被替换。

(2)#用来给宏参数加引号。对于将表达式转化为包含这个表达式的字符串的需求,可将这个表达式定义成宏的参数exp,在宏内部用#exp来给表达式加引号。

(3)宏替换顺序:一个宏的参数是另一个宏,先替换外面的宏,后替换参数。因此#define _ToStr(x) #x以后_ToStr(a+b)相当于"a+b",而#define X a+b 再_ToStr(X)的结果相当于"X"——先替换外面的宏,给X加了引号,再替换里面的宏,对" "内的宏名不替换。

(4)宏替换顺序:一个带参数的宏内部调用另一个宏,参数也是一个宏,则先替换外层的宏,再替换外层宏的参数,最后替换内层宏。因此采用两层转换之后,外边的宏先被替换了,但没有完全展开,然后参数被替换了(保证参数是宏时被展开),最后外边的宏展开。

《SOC架构-ARM架构-文档导读》-目录 小白请看“Armv8/Armv9架构从入门到精通”专栏。以翻译为主的,深度深度深度深度/深入深入深入 学习ARM架构的文章。 阅读详情

相关推荐

基于ROS下的安卓手机图像和IMU跑ORB-SLAM3

接之前文章继续,手上没有现成的单目+IMU硬件,但是安卓手机几乎人人都有。因此,本文讲下如何用手机跑ORB-SLAM3的Mono和Mono_Inertial。 1. 手机与PC通信 基于ROS下的信息发布和订阅,手机和PC在一个局域网下进行信息(image和IMU)传输。 手机APK参考了github上的2个开源Android_Camera-IMU和android_ros_sensors,基于ros_java生成安卓APP,下载安装任一个APP到安卓手机,界面分别是这样: 手机和PC连一个无

h_372101的博客 1万+

一文解决常见宏定义

一文解决常见宏定义 目录**一文解决常见宏定义****@指令用途****@基础宏定义用法****@带参数的宏定义****@宏定义撤销****@跨行宏定义****@ 三个特殊符号:**#,##,#@**@根据宏定义是否存在,进行条件编译****@常用宏定义****@使用一些宏跟踪调试** @指令用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义...

疯小疯的博客 973

自动驾驶车辆纵向控制实战:基于CARLA与ROS2的PID算法实现

本文详细介绍了基于CARLA与ROS2的自动驾驶车辆纵向控制实战,重点讲解了PID算法的实现与应用。通过搭建仿真环境、实现定速巡航和自适应巡航功能,帮助开发者掌握自动驾驶核心技术。文章还分享了系统集成、仿真验证及常见问题的调试技巧,为自动驾驶开发提供实用指导。

weixin_33728708的博客 355

将一个宏被另一个宏使用

带参数的宏定义的一般形式如下: #define <宏名>(<参数表>) <宏体> 一.如下图 我想要计算一个三角形的面积 我要定义两个宏:一个用来表示:s=1/2*(a+b+c) 一个用来表示:(s-a)(s-b)*(s-c) 刚开始我的代码是这样: 编译器告诉我未定义标识符s 因此改为下方的代码: a,b,c是s(a,b,c)的参数,也是area(a,b,c)的参数 这样就...

qq_64071349的博客 1704

解锁Jetbrains AI助手:中国开发者实战配置与效率跃迁指南

本文为中国开发者提供了一份详细的Jetbrains AI助手实战配置指南。针对服务地域限制,核心解决方案是通过修改Jetbrains账户区域信息并配置网络代理,实现插件的稳定启用。文章进一步分享了AI助手在解读遗留代码、生成中文提交信息、智能问答等场景下的具体应用,旨在帮助开发者深度集成这一工具,实现编码生产力的显著提升。

weixin_28832121的博客 576

基于拟蒙特卡洛模拟法的随机潮流计算matlab程序

由式(4-11)可知,蒙特卡洛模拟法的计算量不受电力系统规模大小影响,因此该方法在一些复杂的电力系统中可以得到应用,包括处理电力系统中有多个间歇性新能源接入的问题,解决系统中多个节点之间相关性问题等等。本章在此基础上提出了基于拟蒙特卡洛模拟的随机潮流计算方法,并且对拟蒙特卡洛法中的拟随机数序列进行了改进,大大提高了随机潮流的计算效率。模拟法的具体思路如下:基于实际工程问题的求解需要,建立与之相对应的随机模拟过程和随机概率模型,使得它们的参数,包括概率分布或者数学期望,能够等于问题的实际解;

weixin_47365903的博客 1797

【C语言进阶剖析】21.C语言中的宏定义与使用分析

文章目录 一、C语言中的宏定义 二、宏定义表达式 三、宏表达式与函数的对比 四、有趣的问题 五、强大的内置宏 六、小结 一、C语言中的宏定义 #define是预处理器处理的单元实体之一 #define 定义的宏可以出现在程序的任意位置 #define 定义之后的代码都可以使用这个宏 #define 定义的宏常量可以直接使用 #define 定义的宏常量本质为字面量 下面的宏常量定义正确吗? 编写代码来测试: #define ERRO...

老胡的博客 2010

Ventoy引导自定义菜单配置详解:手把手教你用ventoy_grub.cfg启动硬盘里的Manjaro

本文详细解析了Ventoy引导自定义菜单配置方法,重点介绍如何通过ventoy_grub.cfg文件启动硬盘中的Manjaro系统。从Ventoy与GRUB2的协作原理到具体配置步骤,包括分区布局设计、关键参数解析及常见问题解决方案,帮助用户实现多系统引导的灵活管理。

weixin_28738165的博客 301

c语言中宏替换时的顺序

http://hi.baidu.com/feichideche/item/f138221d97ada1fc746a84e2 宏替换顺序,这是以前在论坛里看到的一个问题,因此整理下来,供自己学习和参考: 测试程序hello.c: #define _ToStr(x) #x #define __ToStr(x) _ToStr(x) #define Japan_E

xyyangkun的专栏 2665

高通跃龙QCS6490部署yolov11_obb实战:QNN SDK工具链全解析与避坑指南

本文详细解析了在高通跃龙QCS6490平台上部署yolov11_obb模型的实战过程,重点介绍了QNN SDK工具链的使用与优化技巧。从环境配置、模型转换到性能调优,提供了全面的避坑指南和DSP加速配置建议,帮助开发者高效实现旋转框检测任务在边缘设备上的部署。

weixin_29232121的博客 305

R语言中如何获取前向选择(forward selection)选出的变量

前向选择是一种常用的特征选择方法,可以在给定一个预测模型的情况下,逐步添加变量来确定最佳的预测模型。在R语言中,可以使用适当的函数和库来执行前向选择,并获取选出的变量。以下是一个详细的步骤,展示了如何使用R语言执行前向选择并获得选出的变量。通过按照上述步骤,你可以使用R语言执行前向选择,并获取选出的变量。记住,前向选择是一种特征选择方法,可以根据不同的评估指标选择最佳的预测模型。接下来,准备用于前向选择的数据。使用"summary"函数查看前向选择的摘要,并使用"which"函数获取被选中的变量。

WangWEel的博客 924

c语言程序设计课程作业题库,c语言程序设计课程作业题库.docx

程序的三种基本结构是()c顺序结构,循环结构,递归结构c顺序结构,循环结构,选择结构c选择结构,循环结构,递归结构匚顺序结构,选择结构,递归结构 nclude main() {inta=l,b=10;do{b-=a;a++;}while(b--<0);本题分值:4.0用户得分:4.0用户解答:顺序结构,循环结构,选择结构标准答案:顺序结构,循环结构,选择结构若有定义 typedef char...

weixin_30092051的博客 350

OFDM调制解调系统信道估计和均衡算法的MATLAB仿真

然后,从接收到的信号中提取导频序列,并使用LS算法进行信道估计。OFDM(正交频分复用)是一种常用于高速数据传输的调制技术,它将高速数据流分割成多个低速子载波,通过在不同的子载波上传输数据,实现了频域上的正交性。因此,信道估计和均衡算法在OFDM系统中起着至关重要的作用,用于减小信道衰落引起的影响。通过运行上述代码,可以进行基于LS算法的OFDM调制解调系统信道估计和均衡的MATLAB仿真。本文将介绍一种基于LS(最小二乘)算法的OFDM调制解调系统信道估计和均衡算法,并提供相应的MATLAB仿真代码。

uote_e的博客 229

c语言结构体在顺序表中的实现

c语言结构体在顺序表中的实现 #define MAX 100 typedef int datatype; typedef struct { datatype elem[100]; int last; }List,*SeqList;//定义顺序表的类型 SeqList InitList()//初始化顺序表 { SeqList L; L=(SeqList)malloc(sizeof(Liat)...

qq_45853287的博客 2675

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C语言深度剖析(六)

预处理:头文件展开,去注释,宏替换,条件编译 编译:将二进制语言翻译成汇编语言 汇编:将汇编语言翻译成二进制文件(可重定向文件【可被链接,不可被执行】) 链接:自身程序+库文件进行关联,形成可执行程序

2302_81218652的博客 2343

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C语言预处理知识

在C语言学习中,我们通过预处理这节课了解到;我们用C语言直接写出来的代码是不能被计算机进行识别的,需要被翻译为二进制语言才能被计算机收到并执行;这个过程就叫做翻译。翻译过程一般有以下几步:预处理:头文件展开,去注释,宏替换,条件编译等。编译:将C语言翻译成汇编语言汇编:将汇编语言转化为可重定向目标文件(可被链接,已经是二进制,但不是可执行文件)链接:自身程序+库文件进行关联,形成可执行程序。

Menior_的博客 722

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

《C语言深度剖析》第三章 预处理详解 p1 C语言从入门到入土(进阶篇)

本文主要讲了关于预处理和宏定义的各种情况和注意事项。数值宏常量,字符串宏常量,宏充当注释符号。预处理,编译,汇编,链接的总结。去注释和宏替换谁先谁后?如何用define宏定义表达式,宏定义中的空格,#undef和其本质作用等。本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,是为了让大家能够更加深入了解C语言的魅力!

原来45的博客 2924

C语言嵌套宏及# ##用法

关于嵌套宏的使用 问题:下面通过宏定义实现一个可以指定前缀的字符串。 PREFIX+".%d" 方法1:使用#运算符。出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。有时把这种用法的#称为字符串化运算符。 #include<cstdio> #define PREX 1.3.6 #define FORMAT(n) #n".%d\n" int main() { int ival = 246; printf(FORMAT(PREX), ival);// PREX.246 retur

勤学如春起之苗,不见其增,日有所长! 辍学如磨刀之石,不见其损,日有所亏! 2083

C

7、程序中定义以下宏 #define S(a,b) a*b 若定义 int area; 且令area=S(3+1,3+4),则变量area的值为: A.10B.12 C.21D.28 选择A 宏只做替换的. 3+1*3+4=10 8.若a为int类型,且其值为3,则执行完表达式a+=a-=a*a后,a的值是 A.-3B.9 C.-12D.6...

weixin_30555753的博客 288

C语言预编译时,去注释和宏替换是谁先进行呢?

今天我们重点讲下define定义的常量,define定义注释和程序的翻译过程。

m0_64770095的博客 2120

C语言:对于宏的一些概念及技巧

格式:#define 宏名 表达式例如:#define PI3.1415格式: # define 宏名 表达式 例如: # define PI 3.1415 //程序在预处理阶段会将PI替换为3.1415定义: # define 宏名(参数 1 ,参数 2 , . . . . . ) 表达式 调用:宏名(实参 1 ,实参 2 , . . . . . . . . . . . )例如:定义: # define getMax(a , b) a > b?

Mr_zhang1911116的博客 804

c语言定义函数赋值注意事项,C语言 函数同名宏的定义及注意事项

为了实现跨平台,在C语言中,可以通过宏对已经存在的函数进行重新定义。例如,在Windows中,具有itoa这个api函数用于数字转换为字符串:#ifdef WIN32#define itoa(intSource, strTarget) itoa((intSource), (strTarget), 10);#else#define itoa(intSource, strTarget) sprintf...

weixin_35740875的博客 539

C语言笔记

如下所示代码,使用宏定义进行位运算时,结果错误。宏替换只作替换,不做计算,不做表达式求解。宏定义未加括号,导致最后结果计算错误。

Simon的博客 74

宏定义知识点

宏定义,又称为预处理宏或宏替换 1.不带参数的宏定义 #define  用户标识符(宏字符) 字符们(字符串)   (1)#define  PI  3.1415926 (2)#define  ADD 3+4          …          s = ADD * ADD;          printf(“%d\n”, s); ...

weixin_42072280的博客 689

python预处理c语言_你必须知道的C语言预处理的问题详解

C语言预处理器执行宏替换、条件编译和文件包含。通常采用以“#”为行首的提示。下面是C语言预处理的应用场合:1.三字母词(Trigraph Sequences)C源程序的字符集被包含在7位的ASCII字符集中,但是它是ISO 646-1983 Invariant Code Set的超集。为了让程序可以在缩减集(reduced set)中呈现出来,下面的三字母词会被替换成相应的单字符.三字母词单字符?...

weixin_35479284的博客 198
上一篇: DbVisualizer6.5.7 报 Selection executes are not allowed in DbVisualizer Free!
下一篇: 头文件不是可有可无的
小南和小北
博客等级 码龄18年 16粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值