Недавно я осознал, что вообще не знаю, как работает компилятор ac / 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 не # включается там, где существует метод main, где в следующем фрагменте кода
Фрагмент 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, например,
Snippet 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 обрабатывает файлы и исходный код в процессе компиляции.Что здесь происходит?