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

HI3403烧录全流程:从ToolPlatform安装到eMMC配置避坑指南 本文详细介绍了海思HI3403芯片的完整烧录流程,涵盖从ToolPlatform工具安装、驱动配置到eMMC分区策略的实战指南。文章深入解析了BurnTool工具的使用方法、关键配置项,并提供了烧录过程中的常见问题排查与解决方案,旨在帮助开发者高效、稳定地完成HI3403嵌入式系统的部署。 阅读详情

相关推荐

Qt EGLFS 图形后端详解

EGLFS (EGL Full Screen) 是Qt框架在嵌入式Linux系统中的高性能图形显示后端,它提供了直接基于EGL和OpenGL ES的硬件加速渲染解决方案。

浩瀚之水的专栏 513

一文解决常见宏定义

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

疯小疯的博客 973

基于Xilinx K7-410T的高速DAC之AD9129开发笔记(一)

引言:从本文开始,我们介绍下项目中设计的并行LVDS高速DAC接口设计,包括DAC与FPGA硬件接口设计、软件设计等。项目设计高速DAC采用了ADI公司的AD9129,该芯片最大更新速率5.7Gsps,该芯片在宽带通信应用、LTE、雷达信号产生、干扰机等领域有广泛应用。

FPGA_Designer 2535

将一个宏被另一个宏使用

带参数的宏定义的一般形式如下: #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

【存算一体架构实战】四、突破编译壁垒:手把手实现AI模型到存算硬件的自动映射

摘要:存算一体硬件的性能优势难以充分释放,核心瓶颈在于传统编译器无法高效适配"计算-存储融合"的新型架构。本文系统剖析传统编译流程在存算硬件上的三大痛点:数据布局不匹配导致90%带宽浪费、算子映射效率低使硬件利用率不足30%、缺乏专用优化_pass导致延迟居高不下。通过构建MLIR-PIM编译框架,实现从AI模型到存算硬件的全自动化映射,核心流程包括:TensorFlow模型→MLIR Dialect转换→存算优化_pass→硬件指令生成。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 242

【Unity大规模RTS/攻城战框架】Large Scale Combat System - RTS Sieges深度解析

本文介绍了Unity专业级大规模RTS战斗框架Large Scale Combat System(LSCS)。该系统通过Job System+Burst技术解决了万人级单位的性能问题,提供完整的RTS操作体系、动态阵型系统、战术AI和攻城战功能。其亮点包括可破坏城门、行走城墙、战术AI配置系统,支持URP渲染管线,适用于Total War风格的大规模兵团对战项目。LSCS不仅提供核心战斗系统,还包含UI、小地图等配套模块,是Unity中少有的专业级RTS解决方案,特别适合需要深度战术玩法和大规模战斗的开发者

2403_88403568的博客 1334

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

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

老胡的博客 2010

深入解析 OpenClaw(小龙虾)源码:架构设计与核心实现

OpenClaw用清晰、工程化的代码结构,将复杂的Agent交互流程变成了可管理、可扩展的流水线。无论是想深入了解Agent系统设计,还是希望二次开发定制自己的AI助理,阅读OpenClaw源码都是一次绝佳的学习旅程。希望本文能帮助你快速掌握OpenClaw的核心脉络。如果你对某个模块(如技能开发、安全机制)感兴趣,欢迎继续探讨。本文基于OpenClaw社区版本源码分析,具体实现可能随版本迭代有所调整,请以最新源码为准。

Ven%的博客 449

c语言中宏替换时的顺序

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

xyyangkun的专栏 2665

[漏洞挖掘与防护] 03.漏洞利用之WinRAR安全缺陷复现(CVE-2018-20250)及软件自启动分析

上一篇文章将详细介绍MS08-067远程代码执行漏洞(CVE-2008-4250)及防御过程,它是Windows Server服务RPC请求缓冲区溢出漏洞,利用445端口,并通过Metasploit工具获取shell及进行深入的操作。这篇文章将详细讲解WinRAR漏洞(CVE-2018-20250),并复现了该漏洞和讲解了恶意软件自启动劫持原理。基础性文章,希望对入门的同学有帮助。

杨秀璋的专栏 1090

移花接木,玩转CANoe的几种扩展接口应用(五)——串口设备

近期看到粉丝朋友在CANoe自动化测试方面的关注度很大,今天就围绕这个做一个专题,总结一下以往项目上用过的几种CANoe扩展接口,分享出来希望对相关领域的网友有所帮助。本文是该专题的第五篇文章,主要讲解了串口设备的功能配置、连接方法、配置方法、调用方法,最后分析了这种扩展借口应用的特点和适用场景。

Mr.Cssust的博客 2369

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

【C语言】一文带你拿捏分支和循环语句(一万字详细讲解)

if/switch语句、while/fo/do...while循环语句、goto语句详解

StackFrame 1234

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

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C语言深度剖析(六)

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

2302_81218652的博客 2343

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C语言预处理知识

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

Menior_的博客 722

《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、付费专栏及课程。

余额充值