C Proqramlaşdırmada Protsessor Direktivləri

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

giriş

Biz proqram yazanda o, həmişə düz irəli getmir. Biz həmişə bəzi sabitlərlə, bəzi əvvəlcədən təyin edilmiş şərtlərlə, funksiyalarla və s. ilə məşğul olacağıq. Bu əvvəlcədən təyin edilmiş sabitlər və funksiyalar müxtəlif proqramlarda dəfələrlə istifadə olunur və ya çağırılır. Nümunələrdən biri standart girişdən girişin oxunmasıdır, yəni; klaviaturadan istifadəçinin daxil etdiyi və ya basdığı ​​düyməni oxuyan bəzi funksiya tələb olunur. İstifadəçinin daxil etdiyi məlumatları oxumaq üçün hər bir proqramda funksiya yazmaqdansa, klaviaturadan daxil edilmiş məlumatları oxumaq üçün standart/ümumi funksiya yaza bilərik, yəni; scanf (). Bu funksiya standartda saxlanılacaq giriş çıxışı preprosessor direktivindən istifadə edərək proqrama daxil edilə bilən kitabxana. Biz bu preprosessor direktivini də başlıq faylı adlandırırıq. Kompilyator proqramı tərtib etdikdə əvvəlcə başlıq fayllarında olan bütün kodları cari proqrama əvəz edir, sonra isə proqramı tərtib edir. Beləliklə, proqram scanf funksiyasını çağırdıqda başlıq faylından funksiya tərifini alır. Bu şəkildə, bütün digər proqramlarda əvvəlcədən təyin edilmiş funksiyadan istifadə etməyə kömək edir.

Eynilə, bir proqramda işçilərin maaşını 10% artırmalı olduğumuzu düşünək. Bu, əmək haqqını artıracağımız sabit bir dəyərdir. Ancaq bir proqram yazdığımızda bu artım faktorunu kodlaşdırmaqda çətinlik çəkəcəyik. Dəyərləri artıracağımız bir çox yer olacağını düşünək. Bu proqram əmək haqqını artırmaq üçün bir neçə istifadəçi və ya bir neçə dəfə istifadə edilə bilər. Bu artım faizi dəyişsə nə edək? Maaş artımı edildiyi yerdə bütün proqramı dəyişdirməliyik. Bunu etmək əvəzinə, bu artım faizini bir dəyişəndə ​​təyin edib sabit kimi qeyd etsək, bu faiz dəyişdikdə bütün proqramı dəyişdirmək çətinliyini aşa bilərik. Ancaq sabit bir dəyişən təyin edib bir proqramda istifadə etsək, kompilyator proqramı tərtib etdikdə, tərtib zamanı sabit dəyişən dəyərini əvəz etməz. İş vaxtında yaddaş ünvanı olan bir dəyişən olaraq əvəz ediləcəkdir. Bu icra edərkən vaxt aparan bir işdir. Dəyəri sabit bir dəyişkəndə saxlaya biləcəyimiz və bu dəyişənin dəyərini yaddaş ünvanı ilə dəyişən kimi əvəz etmək əvəzinə özü kimi əvəz edən bir imkanımız varsa, icra müddəti çox az olacaq. Bu məqsədlə əvvəlcədən işləyən təlimatı istifadə edə bilərik.

Əməliyyatçı Direktivləri

Preprocessor direktivləri, mətni əvəz etmək üçün proqramda istifadə olunan mətn əvəzetmə vasitəsidir. Dəyişəndən fərqlidir. Proqramda bir dəyişən istifadə edildikdə, tərtibçi onu bəzi yaddaş adreslərində saxlanılan bir dəyər kimi başa düşür. Ancaq proqramda əvvəlcə prosessor direktivindən istifadə edildikdə, yaddaşdakı bəzi dəyər və ya kod kimi mətn və ya prosessor direktivinin adı nəzərə alınmır. Kompilyator onları proqramdakı həqiqi dəyəri ilə əvəz edir və sonra proqramı tərtib edir.

Məsələn, məvacibi 10% artırmaq məcburiyyətindəyik və bu sabiti dəyişkən olaraq təyin etdik. Sonra:

const float SAL_INCRE= 0.1;

Yuxarıdakı sabit dəyişəndən istifadə edərək proqramda hər hansı bir kodumuz varsa, kompilyator proqramı tərtib etdikdə aşağıdakı kodu görəcəkdir:

intSal = intSal * SAL_INCRE; → Kompilyator SAL_INCRE dəyərini işləmə vaxtında əvəz edəcəkdir.

Tutaq ki, bu SAL_INCRE-i sabit dəyişən əvəzinə əvvəlcədən işləyən bir direktiv kimi etdik, sonra kompilyator yuxarıdakı formulu aşağıdakı kimi görür:

intSal = intSal * 0.1;

Bu o deməkdir ki, əvvəlcə prosessor direktivi istifadə edildikdə, adı istifadə olunduğu bütün yerlərdə həqiqi dəyəri ilə əvəz edir.

Preprocessor direktivləri müxtəlifdir - sabitlər, makrolar, şərtlər, funksiyalar və s. Bütün prosessor direktivləri '#' simvolu ilə başlayır və ardından əvvəlcədən işləyən əmr adı verilir. Misal üçün,

#include <stdio.h>// includes header file into current program
#include <string.h> // includes header file into current program
#define SAL_INCRE 0.1 //defines constant value
#define MAX_ARRAY_SIZE 15 // defines maximum array size
#define SQUAR (x) (x*x) //defines the formula for finding the square of a number

#ifndef MESSAGE // defines the value for MESSAGE if this macro is not defined, else it uses the old macro value
	#define MESSAGE "Preprocessor Directive Example" 
#endif

Yuxarıdakı nümunələrdən əvvəlcədən işləyən təlimatların faydalı olduğunu başa düşə bilərik

  • İnkişaf etdirilməsi asan, oxunması asan və dəyişdirilməsi asan olan proqramlar inkişaf edir.
  • Kodun müxtəlif maşınlar arasında daşınması.

#müəyyənləşdirmək

Bu preprocessor direktivi sabit dəyərləri və ya bəzi mesajları və ya bəzi düsturları və ya hər hansı digər makro əvəzetmələri təyin etmək üçün istifadə olunur.

#define PI 3.14 //defines constant value
#define MAX_ARRAY_SIZE 15 // defines constant value which is used for maximum array size
#define SQUAR (x) (x*x) //defines the formula for finding the square of a number
	#define TRUE TR // redefines TRUE as TR, in the program TR can be used instead of TRUE
#define FALSE FL// redefines FALSE as FL, in the program FL can be used instead of FALSE

Yuxarıdakı nümunələrdə ilk ikisi sabit dəyərləri təyin edir. Üçüncüsü, SQUARE funksiyasını təyin etmək üçün istifadə olunur. Son iki direktiv TRUE olaraq TR və FALSE kimi FL olaraq yenidən təyin edilir. Bu yenidən təyin olunan adlar, DOĞRU və ya YALAN istifadə etməli olduğumuz zaman proqramda istifadə edilə bilər. Bu, proqramda çox uzun və ya çətin adlarımız olduqda faydalıdır və adların yenidən təyin edilməsi kodu daha da asanlaşdıracaq və inkişaf etdiriciyə kodu tez yazmağa kömək edəcəkdir.

#undef

Bu, əvvəllər müəyyən edilmiş dəyərləri və ya formulu və ya funksiyaları təyin etmək üçün istifadə olunur. Bu, direktivləri və ya makroları yenidən müəyyənləşdirməliyiksə faydalıdır. Makronu yenidən müəyyənləşdirməliyiksə, əvvəlcə undef istifadə edərək makrosu təyin etməli və sonra defin istifadə edərək yenidən təyin etməliyik.

#define MAX_ARRAY_SIZE 50 // defines maximum array size for the first time
#undef MAX_ARRAY_SIZE // undefines the MAX_ARRAY_SIZE defined earlier
#define MAX_ARRAY_SIZE 15 // redefines maximum array size

Proqramın istənilən yerində makrosu təyin edə bilərik. Məsələn, bəzi şöbələr üçün işçilərin maaşını 10% artırmalıyıq, qalan şöbələr üçün isə 20% artırmaq lazımdır. Bu ssenaridə iki fərqli makro təyin edə bilərik. Ancaq eyni makronu istifadə edərək əvvəlcə maaş artımını% 10 olaraq təyin edə və bu şöbələr üçün hesablamaları həyata keçirə bilərik. Bundan sonra makrosu təyin və təyin edərək dəyəri yenidən% 20 olaraq təyin edə bilərik.
#define SAL_INCRE 0.1 //defines constant value
//Perform the calculations for the employees with 10% increment
#undef SAL_INCRE // undefines the SAL_INCRE defined earlier
#define SAL_INCRE 0.2 // redefines maximum array size
//Calculate the salary for rest of the employees

Başlıq Dosyaları - # daxil edin

Bu ön prosessor direktivi digər sənədləri cari proqrama daxil etmək üçün istifadə olunur. Ümumiyyətlə daxil edilməli olan fayllar '.h' uzantısı ilə qeyd olunur. Aşağıdakı kimi prosessor direktivindən istifadə edərək sənədləri cari proqrama daxil edirik:

#include <file_name.h> //Used for inbuilt header files

OR
#include "file_name.h" //Used for user defined header files

#include <stdio.h>// includes header file into current program
#include “string.h” // includes header file into current program

Bu preprocessor direktivi həm də header faylları adlanır. Çünki hər hansı bir proqramın icrası üçün əvvəlcədən təyin olunmuş bəzi funksiyalardan və makrolardan istifadə etməliyik. Bunların hamısı başlıq sənədlərində müəyyənləşdirilir və əvvəlcə fayla daxil edilməlidirlər. Tərtibçi proqramı tərtib etdikdə əvvəlcə sistemdəki bu başlıq sənədlərini axtarır (ümumiyyətlə bu fayllar proqram qovluğunun özündə olacaq; əks halda onlar usr / include / folder-də olacaq).

Proqrama bir başlıq faylı daxil edildikdə, aşağıda ilk kod kimi yazılır. Tərtibçi kodu tərtib etdikdə başlıq faylını aşağıda ikinci kod kimi görür. Yəni başlıq sənədini bütün kodu ilə əvəz edir.

C, istifadəçinin istədiyi qədər başlıq sənədini daxil etməyə imkan verir. Eyni başlıq sənədləri birdən çox dəfə daxil edilə bilər. Yuxarıda kompilyatorun başlıq sənədini məzmunu ilə əvəz edəcəyini gördük. Beləliklə, kompilyator proqramı tərtib etdikdə eyni funksiyanın adını iki dəfə görür və nəticədə səhv olur. C hər hansı iki funksiyanın eyni funksiya adına sahib olmasına icazə vermir. Bundan #ifndef sintaksisindən istifadə edərək başlıq sənədlərini təyin etməklə qarşısını almaq olar. Bu əvvəlcə prosessor əmri əvvəlcə funksiyanın və ya açar sözün müəyyənləşdirilib-edilmədiyini yoxlayır, yoxsa funksiyanı təyin edir. Beləliklə, eyni başlıq faylı iki dəfə daxil edildikdə, funksiyanın artıq müəyyənləşdirildiyini və çıxdığını görür. Buna görə bütün proqram yalnız bir başlıq faylı alır.

#include <stdio.h>
#include “test.h”

void main(){
	printf("Testing header files\n");
	test();
}

// test.h
#ifndef test
#define test() 	printf("Within the header file\n")
#endif

Bəzən müəyyən şərtlərə əsasən fərqli başlıq sənədlərini daxil etmək tələbi yaranacaq. Bu vəziyyətdə, başlıq sənədlərini əlavə etmək üçün #if əvvəlcədən işləyən bir təlimat alırdıq.

#if condition1
	#include"condition1.h"
#elif condition2
	#include"condition2.h"
#elif condition3
	#include"condition3.h"
#endif

Ancaq şərtli ön prosessordan istifadə edərək başlıq sənədlərini daxil etmək şərt sayı artdıqca yorucu olacaqdır. Bundan əlavə, kodu anlamaqda problem yaradır və eyni başlıq sənədinin təkrarlanmasına səbəb ola bilər. Bu problemin öhdəsindən gəlmək üçün C proqram daxilində başlıq sənədini daxil edən bir makro təyin etdiyimiz hesablanmış ehtiva edir.
#define HEADER_FILE "header_file.h" //defining a macro for the header file

#include HEADER_FILE // this will automatically detect which header file to be included and will include it in the program

#if .. # endif

Bu, if şərtinə bənzəyir, lakin daimi tam ədədi qiymətləndirmək üçün istifadə olunur ifadə. Əgər şərtin else və else if şərtləri kimi, onun da müvafiq olaraq #else və #elif var. Bütün #if makrosu #endif ilə bitməlidir.

#if A>B
	#define “A is greater than B" 
#endif

 
#if A>B
	#define "A is greater than B" 
#else
	#define "A is lesser than B"
#endif

Bunlar sadə şərti preprocessor direktivləridir. Şərti kompilyasiyalar üçün iç içə şərti bir ön prosessora sahib ola bilərik.
#if A>B
	#define "A is greater than B" 
#else
	#if B>C
		#define “B is Greater than C”
	#else
		#define “C is Greater than A and B”
	#endif
#endif

#if A>B
	#define "A is greater than B" 
#elif B>C
	#define "B is Greater than C"
#else
	#define"C is Greater than A and B"
#endif

Makro

Makrolar, proqramda tapıldıqda avtomatik olaraq yerinə yetirilən əvvəlcədən təyin edilmiş kodlar toplusudur. Əvvəlcədən təyin edilmiş makrolarla yanaşı istifadəçi tərəfindən müəyyənləşdirilmiş makrolar da mövcuddur. Əvvəlcədən təyin edilmiş makrolardan bəziləri aşağıda verilmişdir. Bu makrolar dəyişdirilə bilməz və əvvəlcədən təyin edilmiş nəticəni qaytarır.

İstifadəçi tərəfindən təyin olunan makrolar yuxarıda #define, #if, #ifdef, #ifndef, #undef və s. Kimi müzakirə olunan, bunlar proqrama daxil edilməsi lazım olan bəzi qayda və şərtləri təyin etmək üçün istifadə olunur. Bu makroların tək sətirlə məhdudlaşdırılmasına ehtiyac yoxdur. #İf .. # elif .. # endif kimi çoxsaylı makrolara və iç içə makrolara sahib ola bilərik.

Makroların sadə adlar və işarələr olmaması lazımdır. Parametrləri də ola bilər. Məsələn, bir ədədin kvadratını tapmaq üçün makro, parametrləşdirilmiş bir makrodur. Nömrəni kvadratı tapılmalı olan parametr olaraq qəbul edir.

#define SQUAR (x) (x*x) //defines the formula for finding the square of a number
#define Factorial (N) (N*Factorial (N-1)) //macro to find the factorial of a number

Preprocessor Operatorları

C dilində yaradılan makrolar da C kodlarından, ifadələrindən və operatorlarından ibarətdir. C ifadələrində istifadə olunan eyni operatorlardan istifadə edir, lakin makro kimi istifadə edildikdə fərqli məna daşıyır.

Çoxsaylı Davamlı Makro (\)

Ümumi ssenaridə makrolar və ya əvvəlcədən işləyən direktivlər tək sətirdə yazılır. Ancaq çox uzun və ya çoxsaylı təriflərə / əmrlərə sahib ola bilərik. Bu cür ssenarilərdə kompilyatora makronun tək sətirlə məhdudlaşmadığını deyən bir operatorumuz olmalıdır; lakin növbəti sətir də eyni makronun bir hissəsidir.

#include <stdio.h>
#define displayEmpName (strName) \
 printf ("Employee name is: %s\n", strName) // definition of macro is in next line

void main(){
	char *strEmpName = "Mathew";

	displayEmpName(strEmpName);
}

Stringiz (#)

Makroslar və ya hər hansı preprosessor direktivləri '#' simvolu ilə başlayır və tərtibçinin onların preprosessor direktivləri olduğunu göstərir. Bu makroların da parametrləri ola bilər. Bu parametrlərə daxil olmaq üçün makro daxilində '#' işarəsi ilə daxil olmaq olar. Bu makro parametrlərinə '#' istifadə edərək makro daxilində daxil olduqda, o onları öz simli ilə əvəz edir dəyər.

#include <stdio.h>
#define displayEmpName(strName) \
 printf("Employee name is: " #strName) //accessing the macro parameter using stringize

void main(){
	displayEmpName("Robert"); // Double quote is also displayed 
}

Nişan yapışdırmaq (##)

Bu, iki fərqli makro parametrini bir parametrə birləşdirmək üçün istifadə olunur.

#include <stdio.h>
#define empSalary(n) printf("Salary of the employee"#n " is: %d\n", salary##n) // appends the employee number

void main(){
	int salary100 = 1000;
	int salary101= 2000;
	int salary102 = 3000;
	int salary103 = 4000;

	empSalary(100);//employee numbers are passed as parameters
	empSalary(101);
	empSalary(102);
	empSalary(103);
}

Bu nümunədə, işçilərin maaşlarını yazdırmaq üçün makro müəyyən edilmişdir. Makroda ilk # n işçini işçiyə əlavə etmək üçün istifadə olunur. İkinci vəziyyətdə '## n' istifadə edildikdə, işçi id'ini 'maaş' a əlavə edir. Bu, printf ifadəsində istifadə edildikdə, dəyişən ilə təmsil olunan dəyəri qaytarır - əmək haqqı100, əmək haqqı200, əmək haqqı300 və s.

Müəyyən edilmişdir ()

Bu, makronun onsuz da müəyyənləşdirildiyini yoxlamaq üçün istifadə olunan operatordur. Tərif edildikdə, TRUE və ya sıfır olmayan bir dəyər qaytarır. Tərif edilməyibsə, YALAN və ya sıfır qaytarır. Bu operator ümumiyyətlə #if vəziyyətdə istifadə olunur.

#include <stdio.h>
#if !defined (SAL_INCREMENT) // verifies if the macro SAL_INCREMENT is already defined
	#define SAL_INCREMENT 0.1 //if not defined, set the value
#endif

void main(){
	int intSal = 10000;

	printf("Salary before Increment = %d\n", intSal);
	printf("Incremented Salary = %f", intSal + (intSal *SAL_INCREMENT));// increments the salary
}

xülasə

Müxtəlif növ əvvəlcədən işləyən direktivlər bunlardır:

Fərqli əvvəlcədən işləyən direktiv sintaksislər:

Crack Sistemi Dizayn Müsahibələri
Translate »