preprocessor directives c
Детальний погляд на директиви препроцесорів на C ++.
Препроцесор - це унікальна особливість С ++. У C ++ у нас є такі етапи, як компіляція, зв'язування та виконання для типової програми. Насправді у нас є багато інших функцій програми на C ++, які потрібно обробити перед передачею програми для компіляції.
Для цього проводиться спеціальний етап, який називається попередньою обробкою. Попередня обробка проводиться перед процесом компіляції, а спеціальні функції попередньо обробляються. В результаті отримується розширена програма C ++, а потім вона передається компілятору.
=> Завітайте сюди, щоб вивчити C ++ з нуля.
Що ви дізнаєтесь:
- Огляд
- Директиви щодо включення файлів
- Директиви щодо визначення макросів
- Директиви про умовне складання
- Оператори # & ##
- Інші директиви
- Попередньо визначені макроси
- Висновок
- Рекомендована література
Огляд
Спеціальні особливості попередньої обробки визначаються за допомогою сутності, що називається “директива попереднього процесора”. Ці директиви препроцесора повідомляють компілятору, що певна інформація в програмі С ++, позначена директивами препроцесора, повинна бути попередньо оброблена перед компіляцією.
Зверніть увагу, що в C ++ усі директиви препроцесора починаються з символу '#'. У той момент, коли препроцесор (частина компілятора) зустрічає символ #, інформація після символу # попередньо обробляється перед передачею програми компілятору.
На відміну від інших операторів С ++, директиви препроцесора не закінчуються крапкою з комою.
У цьому посібнику ми розглянемо різні директиви препроцесора, що підтримуються C ++.
Директиви щодо включення файлів
#включати
Директива про включення файлів #include дозволяє нам включати інші файли до нашої вихідної програми. Ми можемо включити будь-який файл заголовка, який містить визначення різних заздалегідь визначених функцій, у нашу програму, використовуючи ці функції. Ми можемо включити файли заголовків у нашу програму, використовуючи наступний синтаксис.
#include
Приклад: #включати
Ми вже бачили це в наших програмах на C ++. Заголовок iostream містить функції, необхідні для потокового введення / виведення даних, такі як cout, cin тощо.
У міру того, як наші програми збільшуються або функціонал ускладнюється, ми можемо захотіти розділити нашу програму на різні файли або імпортувати функціональність з інших файлів. У цьому випадку ми використовуємо визначені користувачем файли. Щоб включити в нашу програму визначені користувачем файли, ми можемо використовувати наступний синтаксис директиви #include.
#include “filename”
Приклад: #include “vector_int.h”
Це визначений користувачем файл заголовка, який ми маємо намір включити до нашої програми, щоб використовувати його функціональні можливості.
У наведеному нижче прикладі коду показано використання директиви #include.
програмне забезпечення, яке встановлюється на комп'ютері та використовується для управління віртуальними машинами
#include using namespace std; int main() { cout<<'This is an example demonstrating inclusion directive #include'; }
Вихід:
Це приклад, що демонструє директиву включення #include.
Як показано, ми використовували директиву #include, щоб включити функціональність заголовка в нашу програму.
Директиви щодо визначення макросів
#define
Директива #define використовується для визначення символічних констант або макросів у програмі C ++.
Загальною формою директиви #define є:
#define macro_name replacement code
Коли препроцесор зустрічає макрос у програмі, препроцесор замінює цей макрос кодом, визначеним за допомогою директиви #define, перед тим, як код передається компілятору.
Наведений нижче приклад коду показує символічну константу RADIUS, яка визначається за допомогою директиви #define та її використання в програмі.
#include #define RADIUS 5 using namespace std; int main() { cout<<'Area of a circle : '<<3.142 * RADIUS * RADIUS; }
Вихід:
Площа кола: 78,55
Як показано в програмі, ми можемо використовувати символічну константу RADIUS у нашому коді, і вона буде замінена значенням, визначеним для неї за допомогою директиви #define.
найкращі програми для написання для Windows 10
Ми можемо використовувати директиву #define, щоб визначити правильний код функції. Ці функції, як правило, є невеликими функціями.
Приклад наведено нижче.
#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
Тут, використовуючи директиву #define, ми визначили функцію REC_AREA, яка бере два аргументи, тобто довжину і ширину, і обчислює площу прямокутника. У головній функції ми просто використовуємо цей макрос і надаємо йому два аргументи для отримання площі прямокутника.
#undef
Макроси в програмі, визначеній за допомогою директиви #define, тривають доти, поки вона не буде визначена за допомогою директиви #undef. Як тільки програма зустріне #undef, подальше використання макросу (невизначеного #undef) дасть помилку компіляції.
У наведеній вище програмі, якщо ми просто даємо оператор #undef REC_AREA після цілочисельних оголошень, тоді програма видасть помилку компіляції.
Директиви про умовне складання
Окрім директив, пояснених вище, C ++ також надає наступні директиви, які можна використовувати для умовної компіляції коду. Ці директиви можна використовувати в подібних рядках оператора if-else C ++.
Наприклад, ми можемо встановити DEBUG для програми ON або OFF за допомогою цих умовних директив.
Деякі директиви умовної компіляції, надані в C ++, включають:
- # якщо
- #elif
- #endif
- #ifdef
- #ifndef
- #else
Наведена нижче програма демонструє використання директив умовної компіляції в програмі на C ++.
#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
Трасування: Кінець основної функції
У наведеній вище програмі ми використовуємо директиву #ifdef - #endif, щоб визначити ПОЛУЧЕННЯ програми. Тоді ми не визначили макрофункцію MAX, використовуючи директиву #undef. Конструкції умовної компіляції #ifdef - #endif перевіряє, чи встановлено DEBUG, а якщо встановлено, то друкує кілька повідомлень у програмі.
Оператори # & ##
Оператори # та ## - це два спеціальні оператори, які відповідно використовуються для перетворення текстового лексема у рядок, що відображається, та об'єднання двох лексем.
Нижче наведено Приклад, що демонструє обидва ці оператори.
#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) = '< Вихід:
MKSTR (Hello World) = Привіт Світ
concat (x, y) = 100
У наведеній вище програмі ми визначаємо MKSTR з аргументом x. Він має тіло #x. Коли ми друкуємо цей MKSTR, використовуючи аргумент 'Hello World', ми бачимо, що через #x аргумент перетворюється на рядок і відображається на виході.
Далі ми визначили функцію concat з двома аргументами a та b. В тілі ми вказуємо ## b. Вираз a ## b дорівнює ab. Таким чином, у головній функції, коли ми викликаємо concat (x, y), вона насправді обчислюється як xy, що дорівнює цілочисельній змінній, яку ми визначили.
Інші директиви
# помилка
Загальний синтаксис директиви #error:
#error error_message
Коли компілятор зустрічає директиву #error, він відображає повідомлення error_message і компіляція зупиняється. Аргумент error_message може містити одне або кілька слів із лапками або без них.
# лінія
Це повідомляє компілятору змінити внутрішньо збережений номер рядка та ім’я файлу на вказаний номер рядка та ім’я файлу.
# лінія послідовність цифр (“ім’я файлу”)
Послідовність digit__ може бути цілою константою.
Приклад:# лінія 200 тест. c
У наведеному вище прикладі номер внутрішньо збереженого рядка встановлений на 200, а ім'я файлу змінено на test.c.
# прагма
Надає компілятору інструкції, визначені реалізацією. Ці інструкції стосуються компілятора та платформи. Якщо інструкція не відповідає, директива ігнорується без генерування синтаксичної помилки.
Попередньо визначені макроси
С ++ також визначає численні заздалегідь визначені макроси, які можуть бути використані програмістами.
як відсортувати масив int в Java - -
Деякі з цих макросів наведені в таблиці нижче.
Попередньо визначений макрос Опис __ФАЙЛ__ Поточне ім'я файлу програми, що компілюється __ДАТА__ Дата перекладу вихідного коду в об'єктний код у форматі місяць / день / рік __TIME__ Час у формі година: хвилина: секунда, за яку складається програма __LINE__ Номер поточного рядка програми, яка компілюється __cplusplus Ціла константа, яка визначена для кожної версії компілятора
Наступна програма демонструє ці макроси у програмі.
#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< Вихід:
__LINE__: 5
__ФАЙЛ__: prog.cpp
__ДАТА__: 15 квітня 2019 р
__ЧАС__: 12: 09: 15
__cplusplus: 201402
Висновок програми вище відповідає поясненню заздалегідь визначених макросів і є зрозумілим.
Висновок
У цьому посібнику ми бачили різні директиви препроцесора, надані C ++, разом із їх прикладами. Директиви допроцесора допомагають нам писати більш ефективні програми та більш читабельні програми певною мірою.
Директиви умовної компіляції також дозволяють різним чином розгалужувати висновок нашої програми.
=> Шукайте тут цілі навчальні серії C ++.
Рекомендована література
- Тестування програмного забезпечення Довідка Партнерська програма!
- Пишіть та заробляйте - Програма для досвідчених тестувальників контролю якості
- Підручник з труб Unix: Труби в програмуванні Unix
- Бібліотечні функції в C ++
- 70+ НАЙКРАЩИХ підручників для C ++, щоб навчитись програмуванню на C ++ БЕЗКОШТОВНО
- Аргументи командного рядка на C ++
- Ітератори в STL
- Списки ініціалізатора в C ++