Мои самые базовые знания C и процесса компиляции за последнее время стали ржавыми. Я пытался найти ответ на следующий вопрос, но не смог соединить основы компиляции, связывания и предварительной обработки. Быстрый поиск в Google тоже не сильно помог. Итак, я решил прийти к первоисточнику знаний :)
Я знаю: Переменные не должны быть определены в файлах .h. Можно объявить их там.
Почему: Поскольку заголовочный файл может быть включен из нескольких мест, переопределение переменной происходит более одного раза (компоновщик выдает ошибку).
Возможный обходной путь: Используйте защиту заголовков в файлах заголовков и определите переменную в них.
Действительно ли это решение: Нет. Потому что защита заголовков предназначена для фазы предварительной обработки. То есть сообщить компилятору, что эта часть уже включена, и не включать его еще раз. Но наша ошибка в множественном определении возникает в части компоновщика - много после компиляции.
Все это запутало меня из-за того, как работает предварительная обработка и компоновка. Я думал, что предварительная обработка просто не будет включать код, если символ защиты заголовка был определен. В таком случае, не должно ли быть решено многократное определение переменной?
Что происходит, когда эти директивы предварительной обработки спасают процесс компиляции от переопределения символов под защитой заголовка, но компоновщик все же получает несколько определений символа?