Препроцессорный макрос __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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!