preprocessor directives c
Детаљан поглед на директиве о претпроцесору у језику Ц ++.
Претпроцесор је јединствена карактеристика Ц ++. У Ц ++-у имамо кораке попут компајлирања, повезивања и извршавања за типични програм. У стварности имамо пуно других функција у програму Ц ++ које треба обрадити пре него што проследимо програм за компилацију.
У ту сврху се изводи посебан корак који се назива предобрада. Предобрада се врши пре процеса компилације, а посебне карактеристике се унапред обрађују. Као резултат, добија се проширени програм Ц ++, који се затим прослеђује компајлеру.
=> Посетите овде да бисте научили Ц ++ из огреботина.
Шта ћете научити:
- Преглед
- Директиве о укључивању датотека
- Директиве о макро дефиницији
- Директиве о условној компилацији
- # & ## Оператори
- Остале директиве
- Унапред дефинисани макрои
- Закључак
- Препоручено читање
Преглед
Посебне карактеристике за предобраду идентификују се помоћу ентитета који се назива „Препроцессор директива“. Ове директиве претпроцесора кажу компајлеру да одређене информације у програму Ц ++ означене директивама претпроцесора морају бити унапред обрађене пре компајлирања.
Имајте на уму да у Ц ++-у све директиве за претпроцесор почињу са симболом „#“. У тренутку када претпроцесор (део компајлера) наиђе на симбол #, информације које следе симбол # претпроцесирају се пре него што програм проследе компајлеру.
За разлику од осталих израза Ц ++, претпроцесорске директиве се не завршавају тачком и зарезом.
У овом упутству истражићемо разне директиве претпроцесора које подржава Ц ++.
Директиве о укључивању датотека
#инцлуде
Директива о укључивању датотека #инцлуде омогућава нам да у наш изворни програм укључимо и друге датотеке. У наш програм можемо да укључимо било коју заглавну датотеку која садржи дефиниције различитих унапред дефинисаних функција помоћу ових функција. Датотеке заглавља можемо да укључимо у наш програм користећи следећу синтаксу.
#include
Пример: #инцлуде
То смо већ видели у нашим програмима за Ц ++. Заглавље иостреам садржи функције потребне за улазно / излазни пренос података попут цоут, цин итд.
Како се наши програми повећавају или функционалност постаје сложена, можда бисмо желели да поделимо програм на различите датотеке или да увозимо функције из других датотека. У овом случају користимо датотеке које дефинише корисник. Да бисмо у наш програм укључили кориснички дефинисане датотеке, можемо користити следећу синтаксу директиве #инцлуде.
#include “filename”
Пример: #инцлуде “вецтор_инт.х”
Ово је кориснички дефинисана датотека заглавља коју намеравамо да укључимо у наш програм како бисмо користили његову функционалност.
Пример доњег кода приказује употребу директиве #инцлуде.
наочаре за виртуелну стварност за кбок 360
#include using namespace std; int main() { cout<<'This is an example demonstrating inclusion directive #include'; }
Излаз:
Ово је пример који демонстрира директиву о укључивању #инцлуде.
Као што је приказано, користили смо директиву #инцлуде да бисмо укључили функционалност заглавља у наш програм.
Директиве о макро дефиницији
#дефинисати
Директива #дефине користи се за дефинисање симболичких константи или макронаредби у програму Ц ++.
Општи облик директиве #дефине је:
#define macro_name replacement code
Када претпроцесор наиђе на макро у програму, претпроцесор замењује овај макро кодом који је дефинисан помоћу директиве #дефине пре него што се код проследи компајлеру.
Доле наведени пример кода приказује симболичку константу РАДИУС која је дефинисана помоћу #дефине директиве и њене употребе у програму.
#include #define RADIUS 5 using namespace std; int main() { cout<<'Area of a circle : '<<3.142 * RADIUS * RADIUS; }
Излаз:
Површина круга: 78,55
Као што је приказано у програму, можемо користити симболичку константу РАДИУС у нашем коду и он ће бити замењен вредношћу која је за њега дефинисана помоћу #дефине директиве.
ктп питања и одговори за 4 године искуства
Помоћу директиве #дефине можемо дефинисати одговарајући функцијски код. Ове функције су обично мале функције.
Пример је приказан у наставку.
#include #define REC_AREA(length, breadth) (length * breadth) using namespace std; int main() { int length = 20, breadth = 5, area; area = REC_AREA(length, breadth); cout << 'Area of a rectangle is: ' << area; return 0; }
Излаз:
Површина правоугаоника је: 100
Овде смо помоћу директиве #дефине дефинисали функцију РЕЦ_АРЕА која узима два аргумента, тј. Дужину и ширину и израчунава површину правоугаоника. У главној функцији само користимо овај макро и испоручујемо му два аргумента да бисмо добили површину правоугаоника.
#ундеф
Макронаредбе у програму дефинисаном директивом #дефине трају док не буде дефинисано помоћу директиве #ундеф. Једном када програм наиђе на #ундеф, накнадна употреба макронаредбе (недефинисано #ундеф) ће дати грешку у компилацији.
У горњем програму, ако само дамо изјаву #ундеф РЕЦ_АРЕА након целобројних декларација, тада ће програм дати грешку при компилацији.
Директиве о условној компилацији
Поред претходно објашњених директива, Ц ++ такође нуди следеће смернице које се могу користити за условну компилацију кода. Ове директиве се могу користити на сличним редовима наредбе иф-елсе Ц ++.
На пример, можемо подесити ДЕБУГ за програм ОН или ОФФ помоћу ових условних директива.
Неке од условних директива за компајлирање које су дате на језику Ц ++ укључују:
- #ако
- #елиф
- #ендиф
- #ифдеф
- #ифндеф
- #елсе
Програм у наставку приказује употребу условних директива о компилацији у програму Ц ++.
#include using namespace std; #define DEBUG #define MAX(a,b) (((a)>(b)) ? a : b) int main () { int i, j; i = 100; j = 50; #ifdef DEBUG cout <<'Trace: Start of main function' << endl; #endif cout <<'The maximum is ' << MAX(i, j) << endl; #undef MAX //cout <<'The maximum is ' << MAX(10,20) << endl; #ifdef DEBUG cout <<'Trace: End of main function' << endl; #endif return 0; }
Излаз:
Траг: почетак главне функције
Максимално је 100
Траг: Крај главне функције
У горе наведеном програму користимо директиву #ифдеф - #ендиф да дефинишемо ДЕБУГ за програм. Тада смо недефинисали макро функцију МАКС користећи директиву #ундеф. Конструкције условне компилације #ифдеф - #ендиф проверава да ли је постављено ДЕБУГ и ако је постављено, штампа неколико порука у програму.
# & ## Оператори
Оператори # и ## су два посебна оператора која се користе за претварање текстуалног токена у низ који ће се приказати и спајање два токена.
Испод је дат пример који приказује оба ова оператора.
#include using namespace std; #define MKSTR( x ) #x #define concat(a, b) a ## b int main () { cout <<'MKSTR(Hello World) = '<< MKSTR(Hello World) << endl; int xy = 100; cout <<'concat(x,y) = '< Излаз:
најбоље странице за гледање анимеа синхронизоване
МКСТР (Хелло Ворлд) = Здраво свете
цонцат (к, и) = 100
У горњем програму дефинишемо МКСТР аргументом к. Има тело #к. Када исписујемо овај МКСТР користећи аргумент „Хелло Ворлд“, видимо да се због #к аргумент претвара у низ и приказује на излазу.
Даље, дефинисали смо функцију цонцат са два аргумента а и б. У телу наводимо ## б. Израз а ## б једнако је аб. Дакле, у главној функцији када зовемо цонцат (к, и), она заправо израчунава ки што је једнако целобројној променљивој коју смо дефинисали.
Остале директиве
#еррор
Општа синтакса директиве #еррор је:
#error error_message
Када компајлер наиђе на директиву #еррор, приказује поруку еррор_мессаге и компилација се зауставља. Аргумент еррор_мессаге може садржати једну или више речи са наводницима или без њих.
#лине
То компајлеру говори да интерно ускладиштени број линије и назив датотеке компајлера промени у дати број линије и име датотеке.
#лине цифрени низ („назив датотеке“)
Секвенца_цифре може бити целобројна константа.
Пример:# линија 200 тест.ц
У горњем примеру, интерно ускладиштени број линије је постављен на 200 и назив датотеке се мења у тест.ц.
#прагма
Снабдева преводилац дефинисаним имплементацијом упутствима. Ова упутства су специфична за компајлер и платформу. Ако се инструкција не подудара, директива се занемарује без генерисања синтаксне грешке.
Унапред дефинисани макрои
Ц ++ такође дефинише бројне унапред дефинисане макронаредбе које програмери могу да користе.
Неки од ових макронаредби наведени су у наставку.
Унапред дефинисани макро Опис __ФИЛЕ__ Тренутно име датотеке програма који се компајлира __ДАТЕ__ Датум превођења изворног кода у објектни код у формату месец / дан / година __ВРЕМЕ__ Време у форми час: минут: секунда у којој се саставља програм __ЛИНЕ__ Тренутни број реда програма који се компајлира __цплусплус Целобројна константа која је дефинисана за сваку верзију компајлера
Следећи програм приказује ове макронаредбе у програму.
#include using namespace std; int main () { cout<<'__LINE__ :' << __LINE__ << endl; cout<<'__FILE__ :' << __FILE__ << endl; cout<<'__DATE__ :' << __DATE__ << endl; cout<<'__TIME__ :' << __TIME__ << endl; cout<<'__cplusplus:'<<__cplusplus< Излаз:
__ЛИНЕ__: 5
__ФИЛЕ__: прог.цпп
__ДАТЕ__: 15. априла 2019
__ ВРЕМЕ__: 12: 09: 15
__цплусплус: 201402
Излаз програма у складу је са објашњењем претходно дефинисаних макронаредби и сам по себи објашњава.
Закључак
У овом упутству видели смо разне директиве о претпроцесору које пружа Ц ++ заједно са њиховим примерима. Препроцесорске смернице помажу нам да донекле напишемо ефикасније програме и читљивије програме.
Директиве условне компилације такође нам омогућавају да на различите начине разграничимо излазне податке програма.
=> Овде потражите целу серију обука за Ц ++.
Препоручено читање
- Тестирање софтвера Помоћ Аффилиате Програм!
- Напишите и зарадите - Програм за искусне КА тестере
- Водич за Уник цеви: Цеви у програмирању за Уник
- Функције библиотеке на Ц ++
- 70+ НАЈБОЉИХ Водича за Ц ++ за БЕСПЛАТНО учење Ц ++ програмирања
- Аргументи наредбеног ретка на језику Ц ++
- Итератори у СТЛ-у
- Листе иницијализатора у језику Ц ++