stdafx.h и precompiled headers
Я все системные файлы заинклюдил и так в stdafx, но у меня есть хеадеры которые ЧАСТО меняются.. я просто их напрямую включаб в срр а он ругаится?
Мож кто обьяснит этот механизм поподробнее.. потомучто в msdn`e я ненашел.. а хочется не просто нашаманить так чтоб работало, но и понять.. зарание спасибо.
Доволно долго пишу на VC, долго мирился с этим файлом stdafx.h, так понял в нем надо прописывать те заголовочные файлы которые нечасто изменяются.. а в cpp`никах включать именно его, но вот хотелось бы узнать все же нахрена вся эта затея.. да и при сожлании консольного приложения если невключать header`ы в него а непосредственно в cрр, то компилятор ругается типа C1010 unexpected end of file while looking for precompiled header directive.. эта еще че за хрень?
Я все системные файлы заинклюдил и так в stdafx, но у меня есть хеадеры которые ЧАСТО меняются.. я просто их напрямую включаб в срр а он ругаится?
Мож кто обьяснит этот механизм поподробнее.. потомучто в msdn`e я ненашел.. а хочется не просто нашаманить так чтоб работало, но и понять.. зарание спасибо.
Precompiled headers нужны для того, чтобы всё время не компилировать windows.h и ему подобные файлы, которые никогда не меняются. В большом проекте это экономит часы при build'е/rebuild'е.
Там где-то в свойствах проекта есть checkbox типа "use precompiled headers". Если его убрать, precompiled headers использоваться не будут.
Если же установлено использование precompiled headers, то каждый файл должен начинаться с stdafx, иначе получаете эту самую ошибку "unexpected end of file while looking for precompiled header directive".
Кажется, можно указать, для каких конкретно исходников использовать precompiled headers, а для каких — нет, но сам я ни разу не пробовал это делать.
Кажется, можно указать, для каких конкретно исходников использовать precompiled headers, а для каких — нет, но сам я ни разу не пробовал это делать.
А даже если в файле неиспользуется ничего из списка precompiled headers то всеравно сверху надо включать это гребаный stdafx.h? А после свои заголовочные файлы?
Убрать то его можна, я правда чекбокса не нашел но можно убрать в строкe Project->Settings->C/C++ снизу опцию
/Yu"stdafx.h" но тогда будут все заголовки перекомпилироваться.
А даже если в файле неиспользуется ничего из списка precompiled headers то всеравно сверху надо включать это гребаный stdafx.h? А после свои заголовочные файлы?
Да.
... я правда чекбокса не нашел но можно убрать в строкe Project->Settings->C/C++ снизу опцию
/Yu"stdafx.h" но тогда будут все заголовки перекомпилироваться.
Я, к сожалению, не помню точно, как называется checkbox, потому что у меня нет под рукой VS6, но только он там есть. Честно.
Однако, мне всё же кажется, что дешевле написать в начале каждого файла #include "stdafx.h", чем бороться за 21 байт на диске. Отсутствие этого include не ускорит вашу компиляцию больше, чем на пару секунд. Если вообще ускорит.
Да.Я, к сожалению, не помню точно, как называется checkbox, потому что у меня нет под рукой VS6, но только он там есть. Честно.
Project -> Settings... -> Вкладка C/C++ -> В droplist'е Precompiled headers -> Ну а дальше выбираем устраивающий нас вариант =)
Project -> Settings... -> Вкладка C/C++ -> В droplist'е Precompiled headers -> Ну а дальше выбираем устраивающий нас вариант =)
Включите директиву #pragma hdrstop , это означает, что далее прекомпилированный заголовок не будет расширяться.
#include "stdafx.h"
// Нечасто изменяемые headerы
#pragma hdrstop
// Часто изменяемые headerы
При этом должно быть:
1) все файлы до #pragma hdrstop должны включать одни и те же headerы (иначе не будет эффекта).
2) В одном файле проекта в свойствах Create-Use Precompiled header должно быть выбрано Create Precompiled Header (/Yc). (это обычно файл stdafx.cpp, но может быть любой). В остальных - Use Precompiled Header (/Yu).
После изменения headerа до #pragma hdrstop файл с Create Precompiled Header (/Yc) должен быть перекомпилирован первым.