c++之内联函数以及宏定义

C++ 标准库函数与宏定义的名字冲突 今天在使用limits中的numeric_limits类模板函数max和min时,编译出现了一个错误: error C2589: '(' : illegal token on right side of '::'百思不得其解,后来突然想到max和min很有可能已经被定义成了宏,于是查看包进来的头文件,发现蹊跷肯定在中:windows.h包括了windef.h头文件,在windef.h中定义有宏:#ifndef NOMINMAX #ifndef max #define max(a,b) 阅读详情

C++内联函数

参考1:http://www.cnblogs.com/yfanqiu/archive/2012/05/07/2488220.html

参考2:c++ Primer Plus (第六版)

常规函数与内联函数之间的主要区别是:编译器如何将他们组合到程序中。编译过程的最终产品是可执行程序,运行程序的时候,操作系统将这些程序载入到内存中,每条指令都有特定的内存地址,计算机逐步调用程序,调用常规函数指令的时候,程序跳到函数的内存地址,来回跳跃并记录跳跃位置需要一定的开销。

对于内联函数,编译器使用相应的函数代替函数调用,程序无需跳到另外一个位置执行代码,然后再跳回来。因此,内联函数运行的速度比常规函数快,但是需要占用更多的内存。内联函数定义和声明前需要加上关键字inline。内联函数必须是和函数体申明在一起,才有效。建议:内联函数应该在头文件中定义,这一点不同于其他函数。内联函数对于编译器必须是可见的,以便编译器能够在调用点内联展开该函数的代码。此时只有函数原型是不够的。内联函数可能在程序中定义不止一次,只要内联函数的定义在某个源文件中只出现一次,而且在所有源文件中,其定义必须完全相同。把内联函数的定义放在头文件中,可以确保在调用函数时所使用的定义是相同的,并保证在调用点该函数的定义对编译器是可见的。

内联与宏区别:

为什么需要内联函数和宏定义:因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,虽然函数调用开销是很小的,但它会被累积。于是将影响其效率。

宏由预处理对其进行替代,在使用宏的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。(占用编译时间)

而内联函数是通过编译器控制来实现的。在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样在运行时速度更快。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。内联函数可以调试,而宏定义是不可以调试的。(占用执行时间)

宏在编译前进行,即先替换再编译。而函数是编译后,在执行时才调用的。宏占编译时间,而函数占执行时间。

使用宏和内联函数都可以节省在函数调用方面的时间和空间开销。二者都是为了提高效率,但是却有着显著的区别:
(1)、在使用时,宏只做简单的预处理器符号表(字符串)中的简单替换。而内联函数可以进行参数类型检查,且具有返回值(也能被强制转换为可转换的合适类型)。
(2)、内联函数首先是函数,函数的许多性质都适用于内联函数(如内联函数可以重载)。
(3)、内联函数可以作为某个类的成员函数,这样可以使用类的保护成员和私有成员。而当一个表达式涉及到类保护成员或私有成员时,宏就不能实现了(无法将this指针放在合适位置)。

CPP宏定义解析处理【python】 问题描述 c++宏定义文件中关键字有#define, #undef #ifndef, #ifdef, #else,#endif, 处理注释,//,/*,*/, 解析文件,输出其中的宏定义 分析思路 文本分析基础是字符串处理,宏定义文件的处理需要对遇到的关键字执行特殊的处理。 文件定义的中间数据结构用嵌套列表,宏定义主要是顺序结构和分支结构,顺序结构好理解,一个宏定义作为一个字典,字典作为列... 阅读详情

相关推荐

【C++】宏定义函数、内敛函数、static

pass

张林克的博客 578

C++ - 内联函数与宏定义

1.宏定义 宏不是由编译器来处理,而是由预处理器来处理,使用宏其实就是文本替换,是一个直接赋值粘贴的过程,并没有变量类型之类的检查,所以说宏是有副作用的,副作用就是没有类型检查。 在C++中使用内联函数来替代宏代码片段,C++中使用inline关键字声明内联函数。 inline int func(int a,int b) { return a < b ? a : b; } 2.内联函数 -> C++编译器可以将一个函数进行内联编译。 -> 被C++编译器内联编译的函

weixin_49303682的博客 623

手把手教你搞定爱思唯尔LaTeX投稿:从模板到PDF生成的全流程避坑指南

本文详细介绍了使用LaTeX投稿爱思唯尔期刊的全流程避坑指南,包括模板选择、文件结构规范、投稿系统文件上传策略、PDF生成与检查等关键步骤。特别强调了避免常见错误如宏包冲突、图片丢失和参考文献问题,并提供了投稿后的应急方案和高阶自动化校验脚本,帮助研究者顺利完成投稿。

weixin_42525289的博客 510

【C++基础】说说内联函数和宏函数的区别

2.1、使用时的一些注意事项: 使用宏定义一定要注意错误情况的出现,比如宏定义函数没有类型检查,可能传进来任意类型,从 而带来错误,如举例。还有就是括号的使用,宏在定义时要小心处理宏参数,一般用括号括起来, 否则容易出现二义性 inline函数一般用于比较小的,频繁调用的函数,这样可以减少函数调用带来的开销。只需要在函 数返回类型前加上关键字inline,即可将函数指定为inline函数。 同其它函数不同的是,最好将inline函数定义在头文件,而不仅仅是声明,因为编译器在处理 inline函数时,需要在调

广西彭于晏的博客 791

保姆级教程:在DolphinScheduler 3.x中配置Apache SeaTunnel任务(Flink/Spark双引擎)

本文提供了一份详细的教程,指导如何在DolphinScheduler 3.x中配置Apache SeaTunnel任务,支持Flink和Spark双引擎。从环境准备、脚本选择到配置文件编写和任务调度优化,涵盖了所有关键步骤和常见问题解决方案,帮助用户高效集成SeaTunnel到海豚调度系统中。

weixin_42524945的博客 194

CentOS7 编译升级GCC至9.3.0

1)下载GCC9.2.0源码并解压 从GCC官方FTP下载地址可以看到GCC最新版本为9.3.0。由于官网下载速度慢,实际上用清华大学的镜像站进行下载,代码如下: wget -c /opt/tmp/ https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz #考虑到安装失败的可能性,创建一个临时文件夹来安装GCC...

haha123486的博客 1万+

【C++】内联函数(inline)与宏定义(#define)使用说明及区别

详细分析C++中内联函数(inline)与宏定义(#define)使用方法和注意事项以及两者的异同点。

AAADiao的博客 1万+

深入剖析QWEN 2.5模型架构:从GQA到RoPE的技术实现

本文深入解析了QWEN 2.5模型架构,重点介绍了其创新的GQA(分组查询注意力)和RoPE(旋转位置编码)技术实现。通过详细代码解读,展示了这些技术如何提升模型的计算效率和长文本处理能力,适用于代码生成和数学推理等任务。文章还提供了实践部署建议和调优经验,帮助开发者更好地应用这一先进模型。

weixin_42548816的博客 390

C++知识总结——内联函数与宏

内联函数与宏1.内联函数1.1什么是内联函数1.2选择使用内联函数1.3内联函数优缺点1.4内联函数与宏1.5内联函数补充 1.内联函数 1.1什么是内联函数 ​​​  内联函数是c++的增强特性之一,用以提高程序运行速度所做的改进。当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。谈及内联函数我们首先需要知道常规函数调用过程。我们都知道编译过程的最终产物是可执行程序,程序运行时,操作系统将指令再如计算机内存,每条指令都有特定的内存地址,计算机然后又逐步执

qq_43290168的博客 622

anaconda安装-超详细版

文章目录一、anaconda安装1.1 anaconda安装地址1.2 安装详细步骤检验安装是否成功更改conda源(后续安装第三方库可以加快速度) 一、anaconda安装 Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。装anaconda,就不需要单独装python了。 anaconda优点: 1、anaconda里面集成了很多关于python科学计算的第三方库,主要是安装方便,而p

in546的博客 25万+

《AI Coding手册:Claude Code、OpenAI Codex、OpenClaw深度解析与实战指南》

AI编码技术经历了从简单规则匹配到深度神经网络,再到当前智能体(Agent)架构的范式转变。第一阶段:静态代码补全(2010-2018)早期工具如IntelliSense、Emmet基于语法分析和固定模板提供代码提示。这类系统依赖预定义规则,缺乏语义理解能力,仅能处理局部代码片段。第二阶段:统计语言模型(2018-2020)以GPT-2、TabNine为代表,引入基于大规模代码训练的神经语言模型。

AI天才研究院 1033

C++内联函数(Inline)介绍

   介绍内联函数之前,有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用过预处理宏,我们会经常定义一些宏,如#define TABLE_COMP(x) ((x)>0?(x):0)  就定义了一个宏。  为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函

江湖菜鸟的专栏 743

飞行机械臂设计

其后对飞行机械臂系统的机 理模型和基于 ADAMS 的物理模型进行了控制系统的搭建,对于机理模 型,设计了三个输入通道,分别是俯仰力矩,翻滚力矩与偏航力矩,控 制量为翻滚角,俯仰角,偏航角。四旋翼无人机自身具有独特的优势,在无人机上增加机械臂,整个 机体系统相当于一架空中行动自如的空中机器人,可以适应更多的应用场合,能够实现空中抓取,运输载荷,巡航监视等任务。的函数模块如图 4-8 所示,可见输入为 U1,U2,U3,U4,分别对应总力矩,俯仰力矩,翻滚力矩,偏航力矩,控制 量为俯仰角,翻滚角,偏航角。

coldmood77的博客 2917

C++之内联函数

本文介绍了宏和内联函数的相关概念,主要介绍了内联函数的特性。

一只小卷毛的博客 1275

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++宏定义函数

C++宏定义函数 宏允许带有参数,参数包含形参和实参,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,无参宏的宏名后不带参数,其定义的一般形式为: #define 标识符 字符串; 例如#define m a*b; 其中ab的值就是m,在主函数中m就是调用ab; 带参宏定义的一般形式: #define 宏名(参数表) 字符串; 在字符串中含有各个形参。 带参宏调用的一般形式...

weixin_39104847的博客 2899

深度学习工具包 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")

C++中的宏定义详解

转载自:C++中的宏定义和C++宏定义详解 一、#define解析 #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,使得程序的运行与预期的目的不一致,或者在读别人写的程序时,把运行结果理解错误,这对 C语言的学习很不利。 1 #define命令剖析 1.1 #define的概念 #define命令是C语言中的一个...

qq_32584715的博客 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++之内联函数(inline)

概念 内联函数是指用inline关键字修饰的函数,在类内定义的函数被默认成内联函数。 内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。 内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。 对内联函数进行任何修...

PythonGo 8324

C++进阶剖析(四 )之内联函数

1.1类比引出内联函数 1.1.1 宏定义常量 C语言中通过#define 宏定义来定义一个常量,宏定义常量是由预处理器来进行处理的,编译器是看不到的。仅仅是进行了简单的替换。 C++中通过const 定义常量,可以来代替宏定义,const 常量由编译器进行处理,进行了类型检查,和作用域检查。 1.1.2宏定义代码段 C语言中通过#define 宏定义来定义一个代码段,这个代码段由预处理器来进行处...

海是倒过来的天的博客 216

【C++】宏定义

严格来说,这个题目起名为C++是不合适的,因为宏定义是C语言的遗留特性。CleanCode并不推荐C++中使用宏定义。我当时还在公司做过宏定义为什么应该被取代的报告。但是适当使用宏定义对代码是有好处的。坏处也有一些。

矢车菊二十七号 1427

C++宏定义-宏定义与函数的区别-宏的代替方案

本文介绍了C/C++中宏定义(Macro)的基本概念和使用方法。宏通过#define指令定义,在预处理阶段进行文本替换,适合简单常量和代码块替换。文章详细说明了宏的参数传递、多行替换、常见问题(如表达式计算错误)及解决方法(使用括号确保安全)。同时对比了宏与内联函数的优劣:宏无类型检查且难以调试,但效率高;内联函数在保持性能优势的同时解决了类型安全问题。最后总结了宏与普通函数的本质区别,并给出了不同场景下的选择建议,强调宏适合简单替换,复杂逻辑应使用函数或内联函数。

m0_60656600的博客 1111

[cpp]C++中的宏定义

1.不带参数的宏定义:        宏定义又称为宏代换、宏替换,简称“宏”。   格式:   #define 标识符 字符串   其中的标识符就是所谓的符号常量,也称为“宏名”。   预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。   掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。   即在对相关命令

cn_wk的专栏 1万+

C++开发基础之宏定义

宏定义的工作原理涉及到宏的解析和展开过程,以及如何使用带参数的宏。通过对这些过程的理解,我们可以更清楚地掌握宏定义在代码中的作用。当我们讨论如何定义简单的宏和带参数的宏时,我们需要考虑如何使用#define关键字来创建这些宏。使用#define关键字可以定义简单的宏,通常用于定义常量或简单的替换文本。(a) : (b))其中,第一个宏定义了常量PI,第二个宏定义了一个比较大小的函数式宏。带参数的宏可以通过在宏定义中使用参数来实现更灵活的功能。这里,SQUARE宏接受一个参数并返回该参数的平方,而。

dotnet研习社 2096

C/C++宏定义和宏函数

作为Android的开发者,熟悉jni和C++是必须的,最近看到jni的代码中有很多的宏相关的知识点,去学习了解了下整理了本文,本文会介绍宏的定义,包括宏替换和宏函数,以及一些特殊的宏和命令符号

知识应该共享,创造才应收费 1179
下一篇: 预编译头文件
fly_fish_long
博客等级 码龄11年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值