Technology sharing

[C Language]

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. signa praedefinitum

There are some settings in C languageSigna praedefinitadirecte adhiberi possunt, symbola praedefinita在预处理期间处理的

__FILE__    //进行编译的源文件
__LINE__	//文件当前的行号
__DATE__	//文件被编译日期
__TIME__	//文件被编译那一瞬的时间
__STDC__	//如果编译器遵循ANSI C(标准C),其值为1,否则未定义(报错)
  • 1
  • 2
  • 3
  • 4
  • 5

  
Exemplum:

#include<stdio.h>

int main()
{
	printf("%sn", __FILE__);
	printf("%dn", __LINE__);
	printf("%sn", __DATE__);
	printf("%sn", __TIME__);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  
operatio effectus;

Insert imaginem descriptionis hic

Velim hic commemorare VS non plene confirmare ANSI C (vexillum C); gcc gccg*cc* ANSI C subsidia (Latin C)
  

duo, # define defined**************ef***************ine Define constantes (signa)

Syntaxis fundamentalis:

# define name stuff
  • 1

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__ )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Insert imaginem descriptionis hic

Plus est supra codiceparum 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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

Postea repositum:

printf("%dn", 1000;);
  • 1

Print1000;Quid est?

if (1)
	max = 1000;
	;
else
	max = 1;
  • 1
  • 2
  • 3
  • 4
  • 5

aliudelse Quis huic par?
  
Vides aliquid mali cum hoc esseuti # define defined**************ef***************ine Cum denotat definiendo, id non addas

  

tribus,# define defined**************ef***************ine Define tortor

  # define defined**************ef***************ine Mechanismus praescriptum includit;允许把参数替换到文本中Haec exsecutio saepe vocaturMacro marco marcomarcoor * 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
  • 1

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  
operatio effectus;

Insert imaginem descriptionis hic

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));
  • 1
  • 2

  
operatio effectus;

Insert imaginem descriptionis hic

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);
  • 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)
  • 1

Estne igitur dubium cum hac definitione?Inspice hanc definitionem tortor:

#define DOUBLE(X) (X)+(X)
  • 1

Parentheses in definitione usi sumus ad priorem problematum vitandam, sed haec tortor novos errores causare potest.

int a = 5;
printf("%dn", 10 * DOUBLE(a));
  • 1
  • 2

  
operatio effectus;

Insert imaginem descriptionis hic

Output result is not 100 but 55. Ratio similis superioribus est Prior quaestio
  
Solutio:

#define DOUBLE(X) ((X)+(X))
  • 1

In summa, cum utens macrosNumquam skip in parenthesi notatisinopinatos interactiones inter operatores in parametris vel adiacentibus operariis vitare cum macros utendo.

  

4. Macronem parametri ad latus effectus

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++//带副作用
  • 1
  • 2

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  
operatio effectus;

Insert imaginem descriptionis hic

Cur ita?Analyze simul fiat scriptor

z = ((X++) > (y++) ? (x++) : (y++))
  • 1
  • Primo iudicium faciendum; xx*x********++ cum yyy********Iudicium, quod est postfixo +, iudicando xx*x******** eft V; yyy******** est 8, 8 &gt; 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.
  

5. Rules for Macroni replacement

Expand in program # define defined**************ef***************ine Plures gradus sunt in quibus definiendis symbolis et macros

  • Cum tortor vocant, primum参数进行检查Vide an contineat # define defined**************ef***************ine definitum标识符 .Si ita reponuntur primo
  • Sequitur textus replacement被插入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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • MAX ( x , M ) MAX(x, M)MAX(x********,M) medium MMM primum substituitur cum X et X in archetypo inseritur MMM locus
  • Denique eventus denuo lustrantur ut videant an aliquid ex # causatum contineant. define defined**************ef***************ine symbolum definitum, si ita iterare processum superius

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 ) &gt; ( 10 ) ((x) &gt; (10)((x********)>(10) ? ? ? ( x ) : ( 10 ) ) (x):(10))(x********):(10))
  
certe;宏里面嵌套宏et bene sit

MAX(x, MAX(2, 3))
  • 1

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

In supra codiceprintf("M = %d", x);medium MMM non potest reponi per 10

  

6. Comparatio inter macros et munera

Macro superius adhibito ad maiorem duorum numerorum valorem inveniendum.

int Max(int x, int y)
{
	return x > y ? x : y;
}
  • 1
  • 2
  • 3
  • 4

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

  1. Quisque tempus tortor adhibetur, exemplar tortor in programmatis definitionis codice inseritur.Nisi tortor relative brevis sit大幅度增加程序的长度
  2. tortor is没法调试of *
  3. Macros sui generis sunt, id est.不够严谨
  4. Macros potest operandi problemata prioritas causare, programmata facere容易出错

Sed interdum tortor facere quae non potest
  
Exempli gratia:

int* p = (int*)malloc(10 * sizeof * (int));
  • 1

Non placet scribere sic malloc mallocmall*oc Munus nimis gravissimum est, volo大小et类型Consequat ut aperire spatium

Malloc(10, int);
  • 1

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  
Comparatio macros et functiones;

Attributes# define defined**************ef***************ineDefine tortorofficium
Code longitudoSingulis 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 suppliciumcitiusQuibus accedit supra caput functionis vocat et redit (aperturas ACERVUS tabulas), ut tardius incipias.
operator praeceduntParametri 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 effectusParametri substitui possunt in plures positiones in tortor.Munus parametri semel tantum dicuntur quando parametri transeunt, et eventus facilius praedicunt.
Parameter TypeParametri tortor cum typo nihil attinet.Parametri functionis species sunt relatae. Si parametri sunt diversorum generum, requiruntur diversae functiones, etsi idem munus exerceant.
debugMacros incommodum est lusioneMunera potest debugged gradatim
recursusMacros non potest esse recursiveMunera 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