си - константа в define как extern при подключении другого файла

Как импортировать константу из одного файла в другой в си?

Для переменных используем extern: если в первом файле есть int a = 1;, то для использования её во втором файле в нём пишем extern int a;

А как быть с константами? Если в первом файле есть #define b 2, то что надо написать во втором файле для использования в нём этой константы b?


Ответы (2 шт):

Автор решения: LolPopGames

Чтобы вообще понять, что такое #define, нужно понять как наш .c (.cpp тоже) превращается в исполняемый (.exe на Windows, .elf на Linux и т.д.)

Итак, сборка происходит в 4 этапа:

  1. Препроцессинг — обработка всех директив прероцессинга (строк, начинающихся с #), а также удаление комментариев, на выходе .i

  2. Компиляция — трансляция (превращение) этого .i файла в ассемблерный код, на выходе .s/.asm файл

  3. Ассемблирование — также трансляция (превращение) ассемблерного кода в объектный файл, на выходе .o/.obj

  4. Линковка/Компановка — связывание всех объектных файлов в исполнемый


Так вот #define — это директива препроцессора, которая выполниться ещё до компиляции

То есть мы делаем определение (с англ. define — определить)

Препроцессор заменяет все наши определения на то, что мы напишем, буквально, вот просто возьмёт и в тупую вставит

И это произойдёт ещё до компиляции

Вот пример тупой подстановки:

#include <stdio.h>

// На заметку: определения принято называть макросами
#define MACRO some

int main()
{
    printf(MACRO);
}

Как раз этап прероцессинга он пройдёт, и мы получим:

// ... тут код из stdio.h

int main()
{
    printf(some);
}

А вот дальше будет ошибка, на этапе компиляции, потому что компилятор не знает ключевого слова some

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

Поэтому если Вам нужен один и тот же макрос в нескольких файлах, то его просто можно добавлять и туда, и туда, или же, чтобы не копировать код, вынести его в заголовочный файл

→ Ссылка
Автор решения: Ма Пр

ответ Harry: "Перенести в заголовочный файл и подключить". (благодарю и за другие ответы)

→ Ссылка