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