2016-11-23 4 views
0

Просто чтобы посмотреть, будет ли это работать (я знаю, что это ужасная форма), я полностью определил функцию в файле заголовка и сделал соответствующее декларацию для указанной функции в основной cpp-файл. Функции C++ не обязательно должны быть определены в блоке перевода, в котором они используются, поэтому заголовочные файлы - это почти полностью просто декларации (за исключением встроенных функций). Однако, когда я попытался скомпилировать этот проект, он сказал, что были нерешенные внешние.Не скомпилированы ли файлы заголовков (C++ Visual Studio 2015)

Когда я переместил все содержимое файла заголовка в исходный файл (удалив также заголовочный файл), он скомпилировал просто отлично и выполнил, как ожидалось. Итак, файлы заголовков просто не компилируются при создании проекта, или есть только некоторые исключения, о которых я не знаю?

Кроме того, даже когда я просто перехожу к свойствам заголовочного файла в проводнике свойств и устанавливаю его File Type в C/C++ Code и меняю его расширение на .cpp, он все равно не будет компилироваться (хотя он будет, если я просто удалю его и создать новый исходный файл, который, я думаю, является самой странной частью).

(я работаю с расширениями отключенными /Za, если это меняет что-нибудь)

Вот файл кода

//main.cpp 
void foo(); 

void main() 
{ 
    foo(); 
} 

и заголовочный файл

//test.h 
#include <iostream> 

void foo() 
{ 
    std::cout << 'a'; 
} 
+3

Файлы заголовка не скомпилированы, если они не были переведены в блок трансляции с помощью предварительной обработки '# include'. Так как ваш единственный .cpp-файл не имеет такого включения, он не компилируется, и поэтому ничего не доступно для этой (и, по-видимому, единственной) единицы перевода. – WhozCraig

+0

http://faculty.cs.niu.edu/~mcmahon/CS241/Notes/compile.HTML –

ответ

3

файлы заголовков включаются препроцессор в блок компиляции - файл cpp. После этого компилятор компилируется только исходным кодом в файле cpp.

Когда вы помещаете свое определение функции в заголовок .h. Вы не включаете этот файл заголовка в main.cpp, а компилятор не компилирует его, поскольку препроцессор не включает его в main.cpp.

Вы можете просмотреть результат работы препроцессора самостоятельно. В Visual Studio используйте параметр /P на странице свойств Preprocessor. Для main.cpp выход будет в main.i.

1

Файлы заголовков не скомпилированы сами по себе, просто представьте, что текст находится внутри файла .cpp, где он включен. Этот новый «объединенный» файл - это то, что скомпилировано. Таким образом, вы можете поместить функции в файл заголовка, и он будет скомпилирован, когда он будет включен в .cpp-файл.

Причина в том, что если вы включите его во второй файл .cpp, он попытается скомпилировать его снова, и у вас будут проблемы.

1

Проблема с определениями функций в заголовках заключается не в том, что они пропущены. Реальный риск состоит в том, что они скомпилированы дважды, и это слишком много. В C++ есть что-то, называемое Правилом одного определения, и вы нарушаете это правило, компилируя одну функцию дважды.

Есть одно важное исключение: inline функции освобождаются и могут быть определены в каждой единицы перевода.

Смежные вопросы