Условная компиляция (с участием нескольких файлов) - C (СИ)
Формулировка задачи:
Добрый день. Мне нужно выполнить задание, а для этого нужно понять условную компиляцию, которая, честно говоря, не совсем понятна. На данный момент есть три файла - с main(), header с прототипами и .c с самими функциями.
header имеет следующие прототипы:
Его .c файл раскрывает эти функции (не спрашивайте почему я так заполняю массив char - такое задание).
Итак, в .c файле нужно описать функции, при этом функции необходимо написать для работы с массивом целых, действительных и символьных значений. (Для каждого типа написать отдельную функцию) .
Потом в header нужно:
а) описать прототипы всех функций; (уже описаны)
б) сделать проверку определена ли константа, указывающая на тип данных ( #ifdef INTEGER )
в ) создать обобщающие имена функции , которым будет определена функция соответствующего типа в зависимости от константы , указанной в файле prog.cpp . (# define show ShowInt )
В функции же, где main() нужно сделать следующее:
а) в функции main вызвать все функции через переозначеные( обобщенные ) имена из файла function.h ( show ( ))
б) определить константу , которая указывает какой тип данных будет использоваться . Например INTEGER - целые данные, CHAR - символьные DOUBLE - настоящие. (# define INTEGER )
Имя функциям нужно давать так , чтобы они отвечали своей сути . Например функция для вывода значений массива целых чисел на консоль - ShowArrayInt (). А, когда переопределяем функцию с помощью # define то нужно давать общее имя. Например # define ShowArray ShowArrayInt
Я так понимаю, что при помощи условной компиляции я должен сделать возможным вызов функции по определенному типу данных, однако как именно это сделать (программа, кстати, должна быть в трех разных файлах) я не могу понять, у Дейтла и Праты эти темы поверхностно и я не догоняю. Просьба помочь.
void fill_In_Array(int *const Array, const size_t N); void fill_In_Array(double *const Array, const size_t N); void fill_In_Array(char *const Array, const size_t N);
void fill_In_Array(int *const Array, const size_t N) { for (size_t i = 0; i < N; i++) { Array[i] = rand(); } } void fill_In_Array(double *const Array, const size_t N) { for (size_t i = 0; i < N; i++) { Array[i] = rand(); } } void fill_In_Array(char *const Array, const size_t N) { for (size_t i = 0; i < (N - 1); i++) { Array[i] = 32 + rand() % 94; } }
Решение задачи: «Условная компиляция (с участием нескольких файлов)»
textual
Листинг программы
#if defined(INTEGER) void fill_In_Array(int *const Array, const size_t N); #elif defined(DOUBLE) void fill_In_Array(double *const Array, const size_t N); #elif defined(CHAR) void fill_In_Array(char *const Array, const size_t N); #else #error One of the defines is required #endif
Объяснение кода листинга программы
В данном коде представлена условная компиляция с участием нескольких файлов. В зависимости от того, какая из трех переменных (INTEGER, DOUBLE, CHAR) определена, будет скомпилирован соответствующий код для заполнения массива. Если ни одна из этих переменных не определена, то будет сгенерирована ошибка компиляции. Список действий в коде:
- Проверка определения переменной INTEGER. Если переменная INTEGER определена, то будет скомпилирован код для заполнения массива целыми числами.
- Проверка определения переменной DOUBLE. Если переменная DOUBLE определена, то будет скомпилирован код для заполнения массива числами с плавающей точкой.
- Проверка определения переменной CHAR. Если переменная CHAR определена, то будет скомпилирован код для заполнения массива символами.
- Ошибка компиляции. Если ни одна из трех переменных (INTEGER, DOUBLE, CHAR) не определена, то будет сгенерирована ошибка компиляции.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д