про stdafx

Для чого потрібні Precompiled Headers

Precompiled headers призначені для прискорення складання проектів. Зазвичай програмісти починають знайомитися з Visual C ++, використовуючи крихітні проекти. На них складно помітити виграш від precompiled headers. Що з ними, що без них, на око програма компілюється однаковий час. Це додає плутанини. Людина не бачить для себе користі від цього механізму і вирішує, що він для специфічних завдань і йому ніколи не знадобиться. І іноді вважає так багато років.

Насправді, precompiled headers вельми корисна технологія. Користь від нього можна помітити, навіть якщо в проекті всього кілька десятків файлів. Особливо виграш стає помітний, якщо використовуються такі важкі бібліотеки як boost.

Якщо подивитися * .cpp файли в проекті, то можна помітити, що в багато включаються одні й ті-ж набори заголовних файли. Наприклад, vector, string, algorithm. У свою чергу, ці файли включають інші заголовки та так далі.

Можна істотно скоротити обсяг роботи, яку повинен виконати препроцесор при компіляції проекту. Ідея в тому, щоб заздалегідь препроцессіровать групу файлів і потім просто підставляти готовий фрагмент тексту.

Насправді, робиться ще ряд кроків. Можна зберігати не просто текст, а більш оброблену інформацію. Я не знаю, як саме влаштовано в Visual C ++. Але, наприклад, можна зберігати текст уже розбитий на лексеми. Це ще більше прискорить процес компіляції.

Як працюють Precompiled Headers

Файл, який містить precompiled headers, має розширення ".pch". Файл зазвичай збігається з назвою проекту. Природно, це і інші використовувані імена можна змінити в настройках. Файл може бути дуже великим і залежить від того, як багато заголовків файлів в ньому розкрито. Наприклад, у проекті PVS-Studio він займає близько 3 мегабайт.

Файл * .pch виникає після компіляції stdafx.cpp. Файл збирається з ключем "/ Yc". Цей ключ якраз і говорить компілятору, що потрібно створити precompiled headers. Файл stdafx.cpp може містити одну сходинку: #include «stdafx.h».

У файлі «stdafx.h» знаходиться найцікавіше. Сюди потрібно включити заголовки, які будуть заздалегідь препроцессіроваться. Як приклад, ось файл stdafx.h, який використовується нами в PVS-Studio (файл скорочений для статті):

Директиви "#pragma warning" нам потрібні, щоб позбутися від попереджень, що видаються на стандартні бібліотеки.

Тепер в усі файли * .c / *. Cpp слід включити «stdafx.h». Заодно варто видалити з цих файлів заголовки, які вже включаються за допомогою «stdafx.h».

Як використовувати Precompiled Headers

При створенні нового проекту Wizard в Visual Studio створює два файли: stdafx.h і stdafx.cpp. Саме за допомогою них і реалізується механізм precompiled headers.

Насправді, ці файли можуть називатися, як завгодно. Важливо не назва, а параметри компіляції в настройках проекту.

В * .c / *. Cpp файлі можна використовувати тільки один precompiled header. Однак, в одному проекті може бути присутнім кілька різних precompiled headers. Поки будемо вважати, що він у нас тільки один.

Отже, якщо ви скористалися wizard-му, то у вас вже є файли stdafx.h і stdafx.cpp. Плюс виставлені всі необхідні ключі компіляції.

Уявіть ситуацію, якби ми могли включити до «stdafx.h» ще якийсь файл. А в цьому файлі візьмемо і напишемо: #define bool char. Виникає неоднозначність. Ми міняємо вміст всіх файлів, в яких згадується «bool». Тепер просто так не можна взяти і підставити заздалегідь препроцессірованний текст. Ламається весь механізм «precompiled headers». Думаю, це одна з причин, чому «stdafx.h» повинен бути розташований на початку. Можливо, є й інші.

Що включати в stdafx.h

Це дуже важливий момент. Бездумне включення в «stdafx.h» всього підряд не тільки не прискорить компіляцію, а й навпаки сповільнить її.

Всі файли, що включають «stdafx.h», залежать від його вмісту. Нехай в «stdafx.h» включений файл «X.h». Якщо ви поміняєте хоч щось в «X.h», це може спричинити повну перекомпіляцію всього проекту.

Правило. Включайте в «stdafx.h» тільки ті файли, які ніколи не змінюються або змінюються ДУЖЕ рідко. Добрими кандидатами є заголовки системних і сторонніх бібліотек.

Якщо включаєте в «stdafx.h» власні файли з проекту, дотримуйтесь подвійну пильність. Включайте тільки ті файли, які змінюються дуже-дуже рідко.

Якщо якийсь * .h файл змінюється раз на місяць, це вже занадто часто. Як правило, рідко вдається зробити все правки в h-файлі з першого разу. Звичайно потрібно 2-3 ітерації. Погодьтеся, 2-3 рази повністю перекомпілювати весь проект - заняття неприємне. Плюс повна перекомпіляція потрібно всім вашим колегам.

Не захоплюйтеся з незмінними файлами. Включайте тільки те, що дійсно часто використовується. Немає сенсу включати. якщо це потрібно тільки в двох місцях. Там, де потрібно, там і підключіть цей заголовки.

Precompiled headers є дуже корисним механізмом, що дозволяє істотно збільшити швидкість компіляції проектів.