Препроцессорный макрос __LINE__



Препроцессор языка С

Препроцессор (англ. preprocessor ) – программа, выполняющая предварительную обработку входных данных для другой программы.

Препроцессор языка программирования С просматривает программу до компилятора и заменяет в программе определенные сочетания символов (символические аббревиатуры) на соответствующие директивы. Он отыскивает и подключает к программе необходимые файлы и может изменить условия компиляции .

Препроцессор языка С выполняет макроподстановку, условную компиляцию и включение именованных файлов. Строки, начинающиеся со знака # (перед которыми разрешены символы пустого пространства), задают препроцессору инструкции-директивы.

Имеются следующие директивы препроцессора:

#define #endif #ifdef #line
#elif #error #ifndef #pragma
#else #if #include #undef

Директива #include

С этой директивой мы уже не раз встречались, подключая заголовочные файлы стандартной библиотеки языка, содержащие объявления (прототипы) функций. Когда препроцессор встречает такую директиву, то понимает, что после нее идет имя файла, и включает все содержимое указанного файла в исходный код программы. Поэтому объем кода вашей программы после обработки ее препроцессором может сильно увеличиться.

Если имя файла после директивы #include заключено в угловые скобки (например, ), то поиск заголовочного файла производится в стандартном (специально оговоренном системой) каталоге. Однако в тексте программы может встречаться и такая запись:

 

#include "ext.h"

В таком случае заголовочный файл в первую очередь будет искаться в текущем каталоге. Таким образом, программист сам может определять заголовочные файлы для своих проектов. Кроме того, можно указывать адрес заголовочного файла:

Директива #define

Директива #define определяет идентификатор и последовательность символов, которая будет подставляться вместо идентификатора каждый раз, когда он встретится в исходном файле

. Идентификатор называется именем макроса, а сам процесс замены – макрозаменой (макрорасширением, макрогенерацией, макроподстановкой)

В общем виде директива #define выглядит следующим образом (должно быть задано буквами латинского алфавита):

#define имя_макроса последовательность_символов

В определении, как правило, в конце последовательности символов не ставится точки с запятой.

 Между идентификатором и последовательностью символов последовательность_символов может быть любое количество пробелов, но признаком конца последовательности символов может быть только разделитель строк.

Имена макросов обычно задаются с помощью букв верхнего регистра.

 

Теперь давайте разберем принцип работы define. Перед компиляцией программы, во всех местах, где используется наш идентификатор, будет произведена замена его на значение, которое мы указали там же. Вот пример говорящий о его полезности:

#define SIZE 5
for (int i=0; i < SIZE; i++){
for (int j=0; j < SIZE;j++){
printf("*");
}
printf("\n");
}

У директивы #define имя макроса может определяться с формальными параметрами. Тогда каждый раз, когда в программе встречается имя макроса, то используемые в его определении формальные параметры заменяются теми аргументами, которые встретились в программе.

Такого рода макросы называются макросами с формальными параметрами (макроопределениями с параметрами и макросами, напоминающими функции )]. Ключевым элементом макроса с параметрами являются круглые скобки, внутри которых находятся собственно формальные параметры.

#define идентификатор строка символов
заменяет все последующие вхождения идентификатора строкой символов.
пример:
#define A_NUMBER 100
int n=A_NUMBER
;
n присвоится значение 100

#define можно применять также для определения макросов,например
#define SWAP(a,b) temp=(a);(a)=(b);(b)=temp

Рассмотрим пример макроса с тремя параметрами для определения следующего условия: будет ли остаток от деления случайной функции на правую границу интервала больше, чем половина этого интервала.

Программный код решения примера

#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <time.h> #define MAX(a,b,c) ((1+rand()%(b)) > ((a)+(b))/2 ) ? (c):(b) int main (void) {   int a, b, c;   srand((unsigned) time(NULL));    printf("\n Enter a, b, c: ");   scanf_s("%d%d%d", &a, &b, &c);   printf("\n MAX(a,b,c): %d\n", MAX(a,b,c));    printf("\n\n ... Press any key: ");   _getch();   return 0;}

Препроцессорный макрос __LINE__

Макрос __LINE__ разворачивается в текущий номер строки в исходном файле, как целое значение. __LINE__ полезен при создании лог-файла или генерации сообщений об ошибках с указанием номера строки, предназначенных для программистов, при отладки кода.

Макрос __LINE__ часто используется совместно с макросом __FILE__, который показывает адрес текущего исходного файла.


Дата добавления: 2018-09-20; просмотров: 267; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!