Недавно я понял, что понятия не имею, вообще говоря, как работает компилятор c/c++. Я признаю, что изначально это произошло из-за попытки понять защиту заголовков, но пришел к выводу, что мне не хватает понимания того, как работает компиляция.
Возьмем, к примеру, Visual C++; Там есть папка «Файлы заголовков», папка «Файлы ресурсов» и папка «Исходные файлы». Есть ли какое-то значение в разделении этих папок и того, что вы в них кладете? Для меня все они являются исходными файлами. Возьмите фрагменты кода:
Фрагмент 1
//a1.h
int r=4;
а также
//a1.cpp
int b //<--semicolon left out on purpose
а также
//main.cpp
#include <iostream>
#include "a1.h"
void main()
{
cout << r;
}
Компилятор выдает ошибку a1.cpp(3): фатальная ошибка C1004: обнаружен неожиданный конец файла там, где я ожидал, что этого не произойдет, потому что файл a1.cpp не #included, где существует основной метод, где в следующем фрагмент кода
Фрагмент 2
//a1.h
int r=4 //<--semicolon left out on purpose
а также
//a1.cpp
int b = 4;
а также
//main.cpp
#include <iostream>
void main()
{
cout << b;
}
Ошибки, потому что main.cpp(6): ошибка C2065: 'b': необъявленный идентификатор. Если вы включите a1.cpp вот так
Фрагмент 3
//a1.h
int r=4 //<--semicolon left out on purpose
а также
//a1.cpp
int b = 4;
а также
//main.cpp
#include <iostream>
#include "a1.cpp"
void main()
{
cout << b;
}
компилятор жалуется a1.obj: ошибка LNK2005: int b (?b@@3HA) уже определен в main.obj. Оба фрагмента 2 и 3 игнорируют тот факт, что int r = 4
не имеет пропущенной точки с запятой, поскольку я подозреваю, что это как-то связано с файлом xxxx.h. Если я удалю файл a1.cpp из проекта на фрагменте 1, он отлично скомпилируется. Ясно, что я ожидал не то, что я получаю. Существует множество книг и руководств о том, как кодировать в cpp, но мало о том, как cpp обрабатывает файлы и исходный код в процессе компиляции. Что здесь происходит?