2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
There are some settings in C languageSigna praedefinitadirecte adhiberi possunt, symbola praedefinita在预处理期间处理的
。
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译日期
__TIME__ //文件被编译那一瞬的时间
__STDC__ //如果编译器遵循ANSI C(标准C),其值为1,否则未定义(报错)
Exemplum:
#include<stdio.h>
int main()
{
printf("%sn", __FILE__);
printf("%dn", __LINE__);
printf("%sn", __DATE__);
printf("%sn", __TIME__);
return 0;
}
operatio effectus;
Velim hic commemorare VS non plene confirmare ANSI C (vexillum C); gcc gccg*cc* ANSI C subsidia (Latin C)
Syntaxis fundamentalis:
# define name stuff
exempli gratia:
#define MAX 100
#define reg register // 为 register 这个关键字创建一个简短的名字
#define do_forever for(;;) //用更形象的符号来替换一种实现
#define CASE break;case //在写 case 语句的时候自动吧 break 写上
//如果定义的 stuff 过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)
#define DEBUG_PRINT printf("file:%stline:%dt
date:%sttime:%sn" ,
__FILE__,__LINE__ ,
__DATE__,__TIME__ )
- Secunda sententia est quare segnities?
- Tertia sententia nam *f***************or * Circularis
初始化、判断、调整都可以省略
sed si iudicium omittitur, significat iudicium semper verum esseinfinitum loop- Hoc in quarto ludo non optimum est, facile molestiam inferre potest.
- Quinta sententialinea continua characterEssentia est ne problemata post ramosa
转义
Retro回车符
ut raeda non iam reditus reditus sit.Non potest esse aliquid post characterem lineae continuationis, press“”
Modo press Intra, aliter continuatio linea sequentis codicis non erit.
Nunc quaestio venit: usus # define defined**************ef***************ine Quando identifier definiens, num in fine illud addis?;
?
exempli gratia:
#define MAX 1000
#define MAX 1000;
int main()
{
int n = MAX;
return 0;
}
Plus est supra codice;
parum videtur redundans, sed nulla elit cursus ligula.
Addere videtur;
Aut non adde;
Satin' erit?
itane sic est?
Intueamur hoc exemplum:
//例一
int main()
{
printf("%dn", MAX);
return 0;
}
//例二
int mian()
{
int max = 0;
if (1)
max = MAX;
else
max = 1;
return 0
}
Postea repositum:
printf("%dn", 1000;);
Print1000;
Quid est?
if (1)
max = 1000;
;
else
max = 1;
aliudelse Quis huic par?
Vides aliquid mali cum hoc esseuti # define defined**************ef***************ine Cum denotat definiendo, id non addas;
# define defined**************ef***************ine Mechanismus praescriptum includit;允许把参数替换到文本中
Haec exsecutio saepe vocaturMacro marco marco(marco)or * Define tortor definemacro define macroa.(d**************ef***************inemacro)
Differentia inter macros et tortor definitionem identificantium superius est:Macronem parametri
En quomodo tortor declaratur;
#define name(parament - list) stuff
unus eorum paramentpar**ament - album albumlegost(Parometer list) est comma-separatum indicem symbolorum, ut in supellectilem supellectilemstu**ff** medium
Nota: paramentpar**ament - album albumlegost(parameter list)Sinistra parenthesinDebet esse cum nomen nominisname iuxta *si quid intercedat whitespace, interpretatur index argumenti supellectilem supellectilemstu**ff** pars.
Exemplum:
//实现一个宏,计算一个数的平方
#define SQUARE(x) x*x
int main()
{
int a = 5;
int ret = SQUARE(a);
printf("%dn", ret);
return 0;
}
operatio effectus;
Ut videre potes, quadratum ex 5 ratione recte computatur
At re vera quaestio est cum codice superiore.
int a = 5;
printf("%dn", SQUARE(a + 1));
operatio effectus;
Cur ita? Effectus 5+1 est 36, et 6 ∗ * ∗ 6 debet esse, 36. 11 quomodo habes?
Difficultas est cum macros, scimus宏是直接替换
tum ex reposito supra codice directe est;
printf("%dn", a+1*a+1);
5 + 6 + 1, effectus naturaliter est 11
Facile hoc problema solvere possumus addendo ad utramque partem parenthesi notae definitionis.
#define SQUARE(x) (x)*(x)
Estne igitur dubium cum hac definitione?Inspice hanc definitionem tortor:
#define DOUBLE(X) (X)+(X)
Parentheses in definitione usi sumus ad priorem problematum vitandam, sed haec tortor novos errores causare potest.
int a = 5;
printf("%dn", 10 * DOUBLE(a));
operatio effectus;
Output result is not 100 but 55. Ratio similis superioribus est Prior quaestio
Solutio:
#define DOUBLE(X) ((X)+(X))
In summa, cum utens macrosNumquam skip in parenthesi notatisinopinatos interactiones inter operatores in parametris vel adiacentibus operariis vitare cum macros utendo.
Cum modulus macronus plus semel in definitione tortor apparet, si modulus estparte effectus, tunc in periculo eris cum hoc tortor utens , inde in不可预测
euentum. Effectus lateris sunt effectus permanentes cum expressio aestimatur.
Exempli gratia:
x + 1; //不带副作用
x++; //带副作用
Sequens MAX tortor demonstrat problemata parametri cum parte effectus.
#define MAX(a,b) ((a) > (b) ? (a):(b))
int main()
{
int x = 5;
int y = 8;
int z = MAX(x++, y++);
printf("x=%d, y=%d, z=%dn", x, y, z);
return 0;
}
operatio effectus;
Cur ita?Analyze simul fiat scriptor
z = ((X++) > (y++) ? (x++) : (y++))
- Primo iudicium faciendum; xx*x********++ cum yyy********Iudicium, quod est postfixo +, iudicando xx*x******** eft V; yyy******** est 8, 8 > 5
- Post iudicium xx*x******** est VI; yyy******** nam 9
- Tunc faciam yyy******** quod + est positum +, effectus 9 est
- Deinde continue yyy******** Praestare auto- incremento; yyy******** Extremum exitum est 10
volumus xx*x******** et yyy******** Cum in tortor, eventus mutaverunt, praesertim yyy********post duas mutationes non terribilis dixisti
Cum modulus cum effectibus lateralibus ad macronum transmittitur, et modulus non semel in tortor apparet, latus etiam parametri effectus non semel est.
Expand in program # define defined**************ef***************ine Plures gradus sunt in quibus definiendis symbolis et macros
参数进行检查
Vide an contineat # define defined**************ef***************ine definitum标识符
.Si ita reponuntur primo被插入
ad locum originalem in programmatis, nominibus parametris tortor quam valoribus substituti sunt#define MAX(a,b) ((a) > (b) ? (a):(b))
#define M 10
int main()
{
int x = 5;
int z = MAX(x, M);
return 0;
}
MAX in praedicto codice etiam per # repraesentatur. define defined**************ef***************ine definitumMacro .In ultima inspectione, eius modulus M substitutus est. Tempus est repone hoc tempus.
MAX ( x , 10 ) MAX ( x , 10 ) ;MAX(x********,10) substituitur ( x ) > ( 10 ) ((x) > (10)((x********)>(10)
?
?
? ( x ) : ( 10 ) ) (x):(10))(x********):(10))
certe;宏里面嵌套宏
et bene sit
MAX(x, MAX(2, 3))
Hoc tempore, primum tortor in parametro reponere, ac deinde totum tortor
Sed notandum est quod hoc不是递归
quod justo tortor, ut argumentum tortor.递归是宏内部又调用了宏本身
。
Item, cum preprocessor perquirit # define defined**************ef***************ine Cum symbolum definiens;Contenta chordarum constantium non sunt quaesita
Quid istuc est?Modo da castaneam et scies.
#define M 10
int main()
{
int x = 5;
int z = MAX(x, MAX(2, 3));
printf("M = %d", x);
return 0;
}
In supra codiceprintf("M = %d", x);
medium MMM non potest reponi per 10
Macro superius adhibito ad maiorem duorum numerorum valorem inveniendum.
int Max(int x, int y)
{
return x > y ? x : y;
}
Inuenimus quod omnes idem faciunt.Sed ad munus "inveniendi maiorem duorum numerorum", scribens tortor voluntatis更有优势
quidam
Duae sunt rationes;
- propter
调用函数
et函数返回
of *codepotest accipere plus quam actu faciendo hoc parvum calculation (cum vocant munusStack crea frame ).Ratio ergo tortor functionis est in programmatis规模
et速度
Melius quam umquam- Potius
函数的参数必须声明类型
quae facit utendum sit tantum in expressionibus congruis generis.E contra, tortor hic multis generibus applicari potest: integer, longus, integer, fluctuetur, adhiberi potest etc
>
Comparare.In laoreet condimentum tortorTypus independensof *。
Semper utemur macros in futurum?Nam tortor nisi, bibendum inSimplex rationon idoneam iis implicatis et magnis operationibus et functionibus macros comparatis Incommoda:
- Quisque tempus tortor adhibetur, exemplar tortor in programmatis definitionis codice inseritur.Nisi tortor relative brevis sit
大幅度增加程序的长度
- tortor is
没法调试
of *- Macros sui generis sunt, id est.
不够严谨
- Macros potest operandi problemata prioritas causare, programmata facere
容易出错
Sed interdum tortor facere quae non potest
Exempli gratia:
int* p = (int*)malloc(10 * sizeof * (int));
Non placet scribere sic malloc mallocmall*oc Munus nimis gravissimum est, volo大小
et类型
Consequat ut aperire spatium
Malloc(10, int);
Munera hoc facere possunt?Non, quiaMunera transire non possunt genera
Et macros facere potest, quia macros don'tNon reprehendoparametri tuitypeof *
#define Malloc(n, type) (type*)malloc(n * sizeof(type))
int main()
{
int* p = Malloc(10, int);
return 0;
}
Comparatio macros et functiones;
Attributes | # define defined**************ef***************ineDefine tortor | officium |
---|---|---|
Code longitudo | Singulis diebus adhibitum est, signum tortor in programmatis inseretur. | Munus valoris in uno loco codice apparet, et quoties munus adhibetur, idem codex in eo loco appellatur. |
Celeritas supplicium | citius | Quibus accedit supra caput functionis vocat et redit (aperturas ACERVUS tabulas), ut tardius incipias. |
operator praecedunt | Parametri Macro in contextu omnium locutionum circumiacentium aestimantur. Nisi parentheses comprehendantur, praecedentia adiacentium operatorum consectaria vagus habere potest. | Parametri functiones semel tantum aestimantur cum munus vocatur, et eius effectus valor functioni praecessit, aestimatio effectus expressionis plus praedictio facit. |
Morbi latus effectus | Parametri substitui possunt in plures positiones in tortor. | Munus parametri semel tantum dicuntur quando parametri transeunt, et eventus facilius praedicunt. |
Parameter Type | Parametri tortor cum typo nihil attinet. | Parametri functionis species sunt relatae. Si parametri sunt diversorum generum, requiruntur diversae functiones, etsi idem munus exerceant. |
debug | Macros incommodum est lusione | Munera potest debugged gradatim |
recursus | Macros non potest esse recursive | Munera potest esse recursive |
Estne ulla via ad commoda miscenda?
Introductio in C ++munus inline inline inlineinline --Habet commoda utriusque utentis ac functionibus
Quisque ut tortor at ipsum efficitur consequat ac eget urna