си - константа в define как extern при подключении другого файла
Как импортировать константу из одного файла в другой в си?
Для переменных используем extern:
если в первом файле есть
int a = 1;,
то для использования её во втором файле в нём пишем
extern int a;
А как быть с константами?
Если в первом файле есть
#define b 2,
то что надо написать во втором файле для использования в нём этой константы b?
Ответы (2 шт):
Чтобы вообще понять, что такое #define, нужно понять как наш .c (.cpp тоже) превращается в исполняемый (.exe на Windows, .elf на Linux и т.д.)
Итак, сборка происходит в 4 этапа:
Препроцессинг — обработка всех директив прероцессинга (строк, начинающихся с
#), а также удаление комментариев, на выходе.iКомпиляция — трансляция (превращение) этого
.iфайла в ассемблерный код, на выходе.s/.asmфайлАссемблирование — также трансляция (превращение) ассемблерного кода в объектный файл, на выходе
.o/.objЛинковка/Компановка — связывание всех объектных файлов в исполнемый
Так вот #define — это директива препроцессора, которая выполниться ещё до компиляции
То есть мы делаем определение (с англ. define — определить)
Препроцессор заменяет все наши определения на то, что мы напишем, буквально, вот просто возьмёт и в тупую вставит
И это произойдёт ещё до компиляции
Вот пример тупой подстановки:
#include <stdio.h>
// На заметку: определения принято называть макросами
#define MACRO some
int main()
{
printf(MACRO);
}
Как раз этап прероцессинга он пройдёт, и мы получим:
// ... тут код из stdio.h
int main()
{
printf(some);
}
А вот дальше будет ошибка, на этапе компиляции, потому что компилятор не знает ключевого слова some
Как можно увидеть, макросы сразу же уничтожаются после первого этапа, в отличие от переменных и констант (объявленных через const),
которые будут существовать даже в исполняемом файле (за исключением оптимизаций компилятора)
Поэтому если Вам нужен один и тот же макрос в нескольких файлах, то его просто можно добавлять и туда, и туда, или же, чтобы не копировать код, вынести его в заголовочный файл
ответ Harry: "Перенести в заголовочный файл и подключить". (благодарю и за другие ответы)