ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это

Π‘++ Builder: ΠΊΠ°ΠΊ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ дСйствия ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²

Для управлСния ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° компилятора #pragma hdrstop. ВсС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄ΠΎ этой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹, ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ€Π°Π·, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… условий:

Π‘ΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ стандартных Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² Π΄ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ€Π°Π·, содСрТащий всС стандартныС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Для этого Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹:

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ эти условия достаточно просто, для этого Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ cpp-Ρ„Π°ΠΉΠ»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки:

Из-Π·Π° наличия этих констант Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ math.hpp Π² Ρ„Π°ΠΉΠ» pch.h нСльзя.

ΠšΡΡ‚Π°Ρ‚ΠΈ, Π‘++ Builder ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ управлСния ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ. НапримСр, ΠΏΡ€ΠΈ создании Π½ΠΎΠ²ΠΎΠ³ΠΎ прилоТСния, Ρ„Π°ΠΉΠ» Unit1.cpp Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ:

Если ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° тСкст vcl.h, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ являСтся ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ большого числа Π΄Ρ€ΡƒΠ³ΠΈΡ… стандартных Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².

Π£ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ составом Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… Π² vcl.h Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… символов (INC_VCLDB_HEADERS, INC_VCLEXT_HEADERS ΠΈ Π΄Ρ€.). Π’ ΠΌΠΎΠ΅ΠΉ вСрсии pch.h эти символы ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ #define Π΄ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ vcl.h, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ числа Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².

Как Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ использованию ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²

Π”Π°ΠΆΠ΅ Π² большом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ использованию ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² достаточно просто.

ПослС этого Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ cpp-модуля Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ 2 строки:

ВсС Ρ€Π°Π½Π΅Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π½Π° своих мСстах, ΠΈΡ… ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π½Π΅ Π½Π°Π΄ΠΎ. НапримСр:

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π²ΠΎ всСх стандартных Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ страТи ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ρ‚ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ ΠΈΡ… ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ Π½Π΅ Π²Π»Π΅Ρ‡Π΅Ρ‚ Π·Π° собой ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

ВСорСтичСски ΠΌΠΎΠΆΠ½ΠΎ Π΅Ρ‰Π΅ большС ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ компиляции, Ссли Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² pch.h Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ стандартныС, Π½ΠΎ ΠΈ всС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ достаточно часто, это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»Π΅Ρ‡ΡŒ Π·Π° собой Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ pch.h, Ρ‡Ρ‚ΠΎ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎ скаТСтся Π½Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π±Ρ‹Π²Π°ΡŽΡ‚ ΠΎΡ‡Π΅Π½ΡŒ большими ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ быстро. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΡ… pch.h Π½Π΅ цСлСсообразно.

Как ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ эффСктивно

ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½ΠΎΠ²Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² Π½ΠΈΡ… pch.h, ΠΈΠ½Π°Ρ‡Π΅ для Π½ΠΈΡ… Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ использован ΠΎΠ±Ρ‰ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·. Вакая ΠΆΠ΅ ситуация ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ, Ссли Π² ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ стандартныС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ вошли Π² pch.h. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹, Π΅ΡΡ‚ΡŒ нСсколько способов:

#ifndef PCH_H #define PCH_H #define INC_VCLDB_HEADERS #define INC_VCLEXT_HEADERS #include /* ВсС, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ 3-мя строчками // Core (minimal) Delphi RTL headers #include #include #include #include #include #include // Core (minimal) VCL headers #if defined(INC_VCL) #include #include #include

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

УскорСниС сборки C ΠΈ C++ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²

МногиС программисты Π½Π΅ ΠΏΠΎΠ½Π°ΡΠ»Ρ‹ΡˆΠΊΠ΅ Π·Π½Π°ΡŽΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° языкС C ΠΈ C++ собираСтся ΠΎΡ‡Π΅Π½ΡŒ Π΄ΠΎΠ»Π³ΠΎ. ΠšΡ‚ΠΎ-Ρ‚ΠΎ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΡΡ€Π°ΠΆΠ°ΡΡΡŒ Π½Π° ΠΌΠ΅Ρ‡Π°Ρ… Π²ΠΎ врСмя сборки, ΠΊΡ‚ΠΎ-Ρ‚ΠΎ β€” ΠΏΠΎΡ…ΠΎΠ΄ΠΎΠΌ Π½Π° ΠΊΡƒΡ…Π½ΡŽ Β«Π²Ρ‹ΠΏΠΈΡ‚ΡŒ ΠΊΠΎΡ„Π΅Β». Π­Ρ‚ΠΎ ΡΡ‚Π°Ρ‚ΡŒΡ для Ρ‚Π΅Ρ…, ΠΊΠΎΠΌΡƒ это Π½Π°Π΄ΠΎΠ΅Π»ΠΎ, ΠΈ ΠΎΠ½ Ρ€Π΅ΡˆΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ€Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы ускорСния сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π·Π½ΠΈ Β«ΠΏΠΎΠΏΡ€Π°Π²ΠΈΠ» ΠΎΠ΄ΠΈΠ½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» β€” ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±Ρ€Π°Π»Π°ΡΡŒ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Β».

ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это

ΠžΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΡƒΠ·Π½Π°Π΅ΠΌ/вспомним ΠΎΠ± основных Ρ„Π°Π·Π°Ρ… трансляции ΠΊΠΎΠ΄Π° C/C++ Π² ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

Богласно ΠΏ.5.1.1.2 Π΄Ρ€Π°Ρ„Ρ‚Π° N1548 Β«Programming languages β€” CΒ» ΠΈ ΠΏ.5.2 Π΄Ρ€Π°Ρ„Ρ‚Π° N4659 Β«Working Draft, Standard for Programming Language C++Β» (ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Π΅ вСрсии стандартов ΠΌΠΎΠΆΠ½ΠΎ приобрСсти здСсь ΠΈ здСсь) ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ 8 ΠΈ 9 Ρ„Π°Π· трансляции соотвСтствСнно. Π”Π°Π²Π°ΠΉΡ‚Π΅ опустим Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΈ рассмотрим абстрактно процСсс трансляции:

ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это

Для упрощСния согласования Ρ€Π°Π·Π½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ† трансляции Π±Ρ‹Π» ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉΡΡ Π² объявлСнии Ρ‡Π΅Ρ‚ΠΊΠΎΠ³ΠΎ интСрфСйса. ВпослСдствии каТдая Π΅Π΄ΠΈΠ½ΠΈΡ†Π° трансляции Π² случаС надобности Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ прСпроцСссора #include.

Π”Π°Π»Π΅Π΅ рассмотрим, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ сборку Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„Π°Π·Π°Ρ…. ΠšΡ€ΠΎΠΌΠ΅ самого ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ способ Π² ΡΠ±ΠΎΡ€ΠΎΡ‡Π½ΡƒΡŽ систСму. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… сборочных систСм: MSBuild, Make, CMake.

Зависимости ΠΏΡ€ΠΈ компиляции

Зависимости ΠΏΡ€ΠΈ компиляции – это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² наибольшСй стСпСни влияСт Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ сборки C/C++ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Они Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #include. ΠŸΡ€ΠΈ этом создаСтся Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ сущСствуСт лишь ΠΎΠ΄ΠΈΠ½ источник объявлСния для ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ сущности. Π Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΆΠ΅ Π΄Π°Π»Π΅ΠΊΠ° ΠΎΡ‚ ΠΈΠ΄Π΅Π°Π»Π° β€” компилятору приходится ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ объявлСния Π² Ρ€Π°Π·Π½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… трансляции. Π•Ρ‰Π΅ сильнСС ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ портят макросы: стоит ΠΏΠ΅Ρ€Π΅Π΄ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ объявлСниС макроса, ΠΊΠ°ΠΊ Π΅Π³ΠΎ содСрТимоС ΠΌΠΎΠΆΠ΅Ρ‚ Π² ΠΊΠΎΡ€Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ.

Рассмотрим ΠΏΠ°Ρ€Ρƒ способов, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ число зависимостСй.

Бпособ N1: ΡƒΠ±ΠΈΡ€Π°ΠΉΡ‚Π΅ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. НС Π½Π°Π΄ΠΎ ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅. Π’Π°ΠΊ Π²Ρ‹ сокращаСтС Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΊΠ°ΠΊ прСпроцСссору, Ρ‚Π°ΠΊ ΠΈ компилятору. МоТно ΠΊΠ°ΠΊ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Β«ΠΏΠ΅Ρ€Π΅Π»ΠΎΠΏΠ°Ρ‚ΠΈΡ‚ΡŒΒ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ/исходныС Ρ„Π°ΠΉΠ»Ρ‹, Ρ‚Π°ΠΊ ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌΠΈ: include-what-you-use, ReSharper C++, CppClean, Doxygen + Graphviz (для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ) ΠΈ Ρ‚.Π΄.

Бпособ N2: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ объявлСния, Π° Π½Π΅ ΠΎΡ‚ опрСдСлСния. Π’Ρ‹Π΄Π΅Π»ΠΈΠΌ 2 Π³Π»Π°Π²Π½Ρ‹Ρ… аспСкта:

1) Π’ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ссылками ΠΈΠ»ΠΈ указатСлями. Для ссылок ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ достаточно ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ объявлСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор Π·Π½Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ ссылки/указатСля (4 ΠΈΠ»ΠΈ 8 Π±Π°ΠΉΡ‚ Π² зависимости ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹), Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° компилятору придСтся ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ трансляции, зависимыС ΠΊΠ°ΠΊ ΠΎΡ‚ Foo.h, Ρ‚Π°ΠΊ ΠΈ Bar.h.

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΡ€Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ связь, достаточно ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° obj ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ ΠΈΠ»ΠΈ ссылкС Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Bar.h:

Π§Ρ‚ΠΎ касаСтся стандартных Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ², Ρ‚ΠΎ здСсь ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΠ»Π½ΠΎΠ²Π°Ρ‚ΡŒΡΡ помСньшС ΠΈ просто Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΡ… Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΈ нСобходимости. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ являСтся Ρ€Π°Π·Π²Π΅ Ρ‡Ρ‚ΠΎ iostream. Π­Ρ‚ΠΎΡ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ вырос Π² Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ…, Ρ‡Ρ‚ΠΎ ΠΊ Π½Π΅ΠΌΡƒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ поставляСтся Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ iosfwd, содСрТащий Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ объявлСния Π½ΡƒΠΆΠ½Ρ‹Ρ… сущностСй. ИмСнно Π΅Π³ΠΎ ΠΈ стоит Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² ваши Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹.

2) Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΠ΄ΠΈΠΎΠΌΡ‹ Pimpl ΠΈΠ»ΠΈ интСрфСйсного класса. Pimpl ΡƒΠ±ΠΈΡ€Π°Π΅Ρ‚ Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, помСщая ΠΈΡ… Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ класс, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ доступСн Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ основан Π½Π° создании абстрактного Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ пСрСносятся Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс, ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΌ чистыС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Оба Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΡƒΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ зависимости Π½Π° этапС компиляции, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ вносят свои Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ: созданиС ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ динамичСского ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ уровня косвСнной адрСсации (ΠΈΠ·-Π·Π° указатСля); ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Π² случаС интСрфСйсного класса β€” расходы Π½Π° Π²Ρ‹Π·ΠΎΠ² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Бпособ N3 (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ): Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, содСрТащиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ объявлСния (Π°Π½Π°Π»ΠΎΠ³ iosfwd). Π­Ρ‚ΠΈ Β«ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‰ΠΈΠ΅Β» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ.

ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Π°Ρ компиляция

ΠŸΡ€ΠΈ стандартном ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ компилятору Ρ€Π°Π· Π·Π° Ρ€Π°Π·ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» для прСпроцСссирования ΠΈ компиляции. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ каТдая Π΅Π΄ΠΈΠ½ΠΈΡ†Π° трансляции самодостаточна, Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ способ ускорСния β€” Ρ€Π°ΡΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΡ‚ΡŒ Ρ„Π°Π·Ρ‹ I-II трансляции, обрабатывая ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ N Ρ„Π°ΠΉΠ»ΠΎΠ² Π·Π° Ρ€Π°Π·.

Π’ Visual Studio Ρ€Π΅ΠΆΠΈΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ„Π»Π°Π³ΠΎΠΌ /MP[processMax] Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π³Π΄Π΅ processMax β€” ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° максимальноС количСство процСссов компиляции.

Π’ make Ρ€Π΅ΠΆΠΈΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ„Π»Π°Π³ΠΎΠΌ -jN, Π³Π΄Π΅ N β€” число процСссов компиляции.

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ CMake (ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΈ Π² кросс-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅), Ρ‚ΠΎ ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ для ΠΎΠ±ΡˆΠΈΡ€Π½ΠΎΠ³ΠΎ списка сборочных систСм Ρ‡Π΅Ρ€Π΅Π· Ρ„Π»Π°Π³ -G. НапримСр, CMake Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ для C++ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° PVS-Studio Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для Visual Studio ΠΏΠΎΠ΄ Windows, Ρ‚Π°ΠΊ ΠΈ Unix Makefiles ΠΏΠΎΠ΄ Linux. Π§Ρ‚ΠΎΠ±Ρ‹ CMake Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Visual Studio с Ρ„Π»Π°Π³ΠΎΠΌ /MP, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки Π² ваш CMakeLists.txt:

Π’Π°ΠΊΠΆΠ΅ Ρ‡Π΅Ρ€Π΅Π· CMake (с вСрсии 2.8.0) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ·Π²Π°Ρ‚ΡŒ ΡΠ±ΠΎΡ€ΠΎΡ‡Π½ΡƒΡŽ систСму с Ρ„Π»Π°Π³Π°ΠΌΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Для MSVC (/MP ΡƒΠΊΠ°Π·Π°Π½ Π² CMakeLists.txt) ΠΈ Ninja (ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ ΡƒΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½):

РаспрСдСлСнная компиляция

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π²ΡˆΠΈΡΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ совСтом, ΠΌΠΎΠΆΠ½ΠΎ Π² Ρ€Π°Π·Ρ‹ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ врСмя сборки. Однако, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΠ³Ρ€ΠΎΠΌΠ΅Π½, ΠΈ этого ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСдостаточно. УвСличивая число процСссов компиляции, Π²Ρ‹ Π½Π°Ρ‚Ρ‹ΠΊΠ°Π΅Ρ‚Π΅ΡΡŒ Π½Π° Π±Π°Ρ€ΡŒΠ΅Ρ€ Π² Π²ΠΈΠ΄Π΅ максимального числа ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ·-Π·Π° процСссора/ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти/дисковых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π—Π΄Π΅ΡΡŒ ΠΈ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ распрСдСлСнная компиляция, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ свободныС рСсурсы Ρ‚ΠΎΠ²Π°Ρ€ΠΈΡ‰Π° Π·Π° спиной. ИдСя проста:

1) прСпроцСссируСм исходныС Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ локальной машинС ΠΈΠ»ΠΈ Π½Π° всСх доступных ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…;

2) ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ прСпроцСссированныС Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° локальной ΠΈ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…;

3) ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… машин Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²;

4) ΠΊΠΎΠΌΠΏΠΎΠ½ΡƒΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹;

Π’Ρ‹Π΄Π΅Π»ΠΈΠΌ основныС особСнности распрСдСлСнной компиляции:

1) Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ, Ρ‡Π΅Ρ€Π΅Π· ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ссылку (symlink)

2) Для CMake, начиная с вСрсии 3.4

Кэш компилятора

Π”Ρ€ΡƒΠ³ΠΈΠΌ способом ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ врСмя сборки являСтся ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ кэша компилятора. НСмного ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Ρ„Π°Π·Ρƒ II трансляции ΠΊΠΎΠ΄Π°:

ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ компиляции прСпроцСссированного Ρ„Π°ΠΉΠ»Π° Π½Π° основС Π΅Π³ΠΎ содСрТимого, Ρ„Π»Π°Π³ΠΎΠ² компиляции, Π²Ρ‹Π²ΠΎΠ΄Π° компилятора вычисляСтся Ρ…ΡΡˆ-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π»Π°Π³ΠΈ компиляции). ВпослСдствии Ρ…ΡΡˆ-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΅ΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» рСгистрируСтся Π² кэшС компилятора. ΠŸΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ компиляции с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ Ρ„Π»Π°Π³Π°ΠΌΠΈ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈΠ· кэша Π±ΡƒΠ΄Π΅Ρ‚ взят ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈ ΠΏΠΎΠ΄Π°Π½ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠ°.

Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

1) Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ, Ρ‡Π΅Ρ€Π΅Π· ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ссылку

2) Для CMake, начиная с вСрсии 3.4

Кэш компилятора Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ. НапримСр, для использования ccache с distcc/Icecream, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

1) УстановитС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ CCACHE_PREFIX:

2) Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² 1 β€” 2 рСгистрации ccache.

ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹

ΠŸΡ€ΠΈ компиляции большого количСства исходных Ρ„Π°ΠΉΠ»ΠΎΠ² компилятор, ΠΏΠΎ Ρ„Π°ΠΊΡ‚Ρƒ, выполняСт мноТСство Ρ€Π°Π· ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ Ρ€Π°Π·Π±ΠΎΡ€Ρƒ тяТСловСсных Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, iostream). Основная идСя Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вынСсти эти тяТСловСсныС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ имСнуСтся прСфиксным Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ компилируСтся Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹ ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π²ΠΎ всС Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ трансляции самым ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ.

Π’ MSVC для создания ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ 2 Ρ„Π°ΠΉΠ»Π°: stdafx.h ΠΈ stdafx.cpp (ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π°). ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ шагом Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ stdafx.cpp с Ρ„Π»Π°Π³ΠΎΠΌ /YcΒ«path-to-stdafx.hΒ». По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ создаСтся Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .pch. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΏΡ€ΠΈ компиляции исходного Ρ„Π°ΠΉΠ»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„Π»Π°Π³ /YuΒ«path-to-stdafx.hΒ». БовмСстно с Ρ„Π»Π°Π³Π°ΠΌΠΈ /Yc ΠΈ /Yu Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ /FpΒ«path-to-pchΒ» для указания ΠΏΡƒΡ‚ΠΈ ΠΊ .pch Ρ„Π°ΠΉΠ»Ρƒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ трансляции прСфиксный Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ самым ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ: Π»ΠΈΠ±ΠΎ нСпосрСдствСнно Ρ‡Π΅Ρ€Π΅Π· #include Β«path-to-stdafx.hΒ», Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· Ρ„Π»Π°Π³ /FIΒ«path-to-stdafx.hΒ».

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ… Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ здСсь.

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ CMake, Ρ‚ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ cotire: ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π² автоматичСском Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исходныС Ρ„Π°ΠΉΠ»Ρ‹, ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ прСфиксный ΠΈ ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… ΠΊ Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌ трансляции. Π•ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ свой прСфиксный Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, stdafx.h).

Single Compilation Unit

Π‘ΡƒΡ‚ΡŒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° β€” ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ» (Π±Π»ΠΎΠΊ трансляции), Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ трансляции:

Если Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ» Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ всС Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ трансляции, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ способ ΠΈΠ½Π°Ρ‡Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Unity build. Π’Ρ‹Π΄Π΅Π»ΠΈΠΌ основныС особСнности Single Compilation Unit:

Π—Π°ΠΌΠ΅Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² трансляции

Π—Π°ΠΌΠ΅Π½Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² трансляции Π½Π° Π±ΠΎΠ»Π΅Π΅ быстрый Π°Π½Π°Π»ΠΎΠ³ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ сборки. Однако, Π΄Π΅Π»Π°Ρ‚ΡŒ это стоит Π½Π° свой страх ΠΈ риск.

Π’ качСствС Π±ΠΎΠ»Π΅Π΅ быстрого компилятора ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Zapcc. Авторы ΠΎΠ±Π΅Ρ‰Π°ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ ускорСниС пСрСкомпиляции ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ пСрСкомпиляции Boost.Math:

ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это

Zapcc Π½Π΅ ΠΆΠ΅Ρ€Ρ‚Π²ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, основан Π½Π° Clang ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ с Π½ΠΈΠΌ совмСстим. Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Zapcc. Если ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ основан Π½Π° CMake, Ρ‚ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ компилятор ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ:

Если ваша ОБ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ELF-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² (Unix-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ систСмы), Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ GNU ld Π½Π° GNU gold. GNU gold ΠΈΠ΄Π΅Ρ‚ Π² составС binutils, начиная с вСрсии 2.19, ΠΈ активируСтся Ρ„Π»Π°Π³ΠΎΠΌ -fuse-ld=gold. Π’ CMake Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ:

ИспользованиС SSD/RAMDisk

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ Β«Π±ΡƒΡ‚Ρ‹Π»ΠΎΡ‡Π½Ρ‹ΠΌ Π³ΠΎΡ€Π»Ρ‹ΡˆΠΊΠΎΠΌΒ» Π² сборкС являСтся ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ дисковых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (Π² особСнности случайного доступа). ΠŸΠ΅Ρ€Π΅Π½ΠΎΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ Π΅Π³ΠΎ самого Π½Π° Π±ΠΎΠ»Π΅Π΅ Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ (HDD с ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½ΠΎΠΉ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ случайного доступа, SSD, RAID ΠΈΠ· HDD/SSD, RAMDisk) Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях ΠΌΠΎΠΆΠ΅Ρ‚ сильно ΠΏΠΎΠΌΠΎΡ‡ΡŒ.

ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½Π°Ρ систСма Π² C++

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Ρ… способов историчСски Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ ΠΈΠ·-Π·Π° Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° трансляции C/C++ языков. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², нСсмотря Π½Π° ΠΊΠ°ΠΆΡƒΡ‰ΡƒΡŽΡΡ простоту, доставляСт ΠΌΠ½ΠΎΠ³ΠΎ Ρ…Π»ΠΎΠΏΠΎΡ‚ для C/C++ программистов.

Π£ΠΆΠ΅ достаточно ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя ΠΈΠ΄Π΅Ρ‚ обсуТдСниС ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² стандарт C++ (ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, появится Π² C++20). ΠœΠΎΠ΄ΡƒΠ»Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ связанный Π½Π°Π±ΠΎΡ€ Π΅Π΄ΠΈΠ½ΠΈΡ† трансляции (ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Π°Ρ Π΅Π΄ΠΈΠ½ΠΈΡ†Π°) с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π²Π½Π΅ΡˆΠ½ΠΈΡ… (экспортируСмых) ΠΈΠΌΠ΅Π½, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… интСрфСйсом модуля. ΠœΠΎΠ΄ΡƒΠ»ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ доступСн для всСх ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π΅Π³ΠΎ Π΅Π΄ΠΈΠ½ΠΈΡ† трансляции Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· Π΅Π³ΠΎ интСрфСйс. НСэкспортируСмыС ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ модуля.

Π”Ρ€ΡƒΠ³ΠΈΠΌ Π²Π°ΠΆΠ½Ρ‹ΠΌ достоинством ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°ΡŽΡ‚ΡΡ измСнСниям Ρ‡Π΅Ρ€Π΅Π· макросы ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Π‘ΠΏΡ€Π°Π²Π΅Π΄Π»ΠΈΠ²ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅: макросы ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора Π²Π½ΡƒΡ‚Ρ€ΠΈ модуля Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ трансляции, ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π΅Π³ΠΎ. БСмантичСски, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ скомпилированныС Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ трансляции.

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ устройство Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Π½ΠΈΡ… большС, Ρ‚ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΊ просмотру выступлСниС Бориса Колпакова Π½Π° CppCon 2017 ΠΎ модулях C++ (Ρ‚Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ сборок):

На сСгодняшний ΠΌΠΎΠΌΠ΅Π½Ρ‚ компиляторы MSVC, GCC, Clang ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.

А Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€ΠΎ сборку PVS-Studio Π±ΡƒΠ΄Π΅Ρ‚?

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим, насколько Π±Ρ‹Π²Π°ΡŽΡ‚ эффСктивными ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ описанныС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹.

Π—Π° основу возьмСм ядро Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° PVS-Studio для Π°Π½Π°Π»ΠΈΠ·Π° C ΠΈ C++ ΠΊΠΎΠ΄Π°. Оно, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, написано Π½Π° C++ ΠΈ прСдставляСт собой консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π―Π΄Ρ€ΠΎ являСтся нСбольшим ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ‚Π°ΠΊΠΈΠΌΠΈ Π³ΠΈΠ³Π°Π½Ρ‚Π°ΠΌΠΈ, ΠΊΠ°ΠΊ LLVM/Clang, GCC, Chromium ΠΈ Ρ‚.Π΄. Π’ΠΎΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π΄Π°Π΅Ρ‚ CLOC Π½Π° нашСй ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅:

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΎ провСдСния всяких Ρ€Π°Π±ΠΎΡ‚ наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ собирался Π·Π° 1.5 ΠΌΠΈΠ½ΡƒΡ‚Ρ‹ (использовались ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Π°Ρ компиляция ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ) Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹:

ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это

Рисунок 1. Π‘Π±ΠΎΡ€ΠΊΠ° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° PVS-Studio, 1 ΠΏΠΎΡ‚ΠΎΠΊ, Π±Π΅Π· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ. Π‘Π²Π΅Ρ€Ρ…Ρƒ β€” сборка Debug вСрсии, снизу β€” Release.

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹, Π·Π° счСт большСй скорости ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ доступа ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° RAMDisk Π±Π΅Π· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ Π² 1 ΠΏΠΎΡ‚ΠΎΠΊ собираСтся быстрСй.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ этап Π·Π°ΠΌΠ΅Ρ€ΠΎΠ² β€” Π΄ΠΎΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ напильником исходный ΠΊΠΎΠ΄: удаляСм Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ², устраняСм зависимости ΠΎΡ‚ опрСдСлСния, ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅ΠΌ ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ (ΡƒΠ±ΠΈΡ€Π°Π΅ΠΌ ΠΈΠ· Π½Π΅Π³ΠΎ часто измСняСмыС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ) β€” ΠΈ постСпСнно ΠΏΡ€ΠΈΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Π΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ:

ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это

Рисунок 2. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π² 1 ΠΏΠΎΡ‚ΠΎΠΊ послС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ.

ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это

ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ ΠŸΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ информация установки Ρ‡Ρ‚ΠΎ это

Рисунок 4. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π² 8 ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² послС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ.

Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Ρ‹:

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Для ΠΌΠ½ΠΎΠ³ΠΈΡ… программистов языки C/C++ Π°ΡΡΠΎΡ†ΠΈΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π½Π΅Ρ‡Ρ‚ΠΎ Β«Π΄ΠΎΠ»Π³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ΡΡΒ». И Π½Π° это Π΅ΡΡ‚ΡŒ свои ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹: Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Π² своС врСмя способ трансляции, ΠΌΠ΅Ρ‚Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (для C++), тысячи ΠΈΡ…. Благодаря описанным ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈΡˆΠΈΡ‚ΡŒ сСбя ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… прСдрассудков ΠΎ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎ Π΄ΠΎΠ»Π³ΠΎΠΉ компиляции. Π’ частности, врСмя сборки нашСго ядра Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° PVS-Studio для Π°Π½Π°Π»ΠΈΠ·Π° C ΠΈ C++ ΠΊΠΎΠ΄Π° ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ с 1 ΠΌΠΈΠ½ΡƒΡ‚Ρ‹ 30 сСкунд Π΄ΠΎ 40 сСкунд ΠΏΡƒΡ‚Π΅ΠΌ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Single Compilation Units ΠΈ ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… ΠΈ исходных Ρ„Π°ΠΉΠ»ΠΎΠ². Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ссли Π±Ρ‹ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Π°Ρ компиляция ΠΈ ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, Π½Π°ΠΌΠΈ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ сСмикратноС ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ сборки!

Π’ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ хочСтся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ± этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ прСкрасно помнят Π² ΠΊΠΎΠΌΠΈΡ‚Π΅Ρ‚Π΅ стандартизации ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ…ΠΎΠ΄ΠΎΠΌ ΠΈΠ΄Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹: всС ΠΌΡ‹ ΠΆΠ΄Π΅ΠΌ Π½ΠΎΠ²ΠΎΠ³ΠΎ стандарта C++20, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠΉ Β«Π·Π°Π²Π΅Π·Ρ‘Ρ‚Β» ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π² Π»ΡŽΠ±ΠΈΠΌΡ‹ΠΉ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ язык ΠΈ сдСлаСт Тизнь C++ программистов Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ² ΠΏΡ€ΠΎ stdafx.h

Для Ρ‡Π΅Π³ΠΎ Π½ΡƒΠΆΠ½Ρ‹ Precompiled Headers

Precompiled headers ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для ускорСния сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². ΠžΠ±Ρ‹Ρ‡Π½ΠΎ программисты Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Π·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Visual C++, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΡ€ΠΎΡˆΠ΅Ρ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹. На Π½ΠΈΡ… слоТно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ ΠΎΡ‚ precompiled headers. Π§Ρ‚ΠΎ с Π½ΠΈΠΌΠΈ, Ρ‡Ρ‚ΠΎ Π±Π΅Π· Π½ΠΈΡ…, Π½Π° Π³Π»Π°Π· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° компилируСтся ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ врСмя. Π­Ρ‚ΠΎ добавляСт ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹. Π§Π΅Π»ΠΎΠ²Π΅ΠΊ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ для сСбя ΠΏΠΎΠ»ΡŒΠ·Ρ‹ ΠΎΡ‚ этого ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° ΠΈ Ρ€Π΅ΡˆΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ для спСцифичных Π·Π°Π΄Π°Ρ‡ ΠΈ Π΅ΠΌΡƒ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ понадобится. И ΠΈΠ½ΠΎΠ³Π΄Π° считаСт Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π³ΠΎΠ΄Ρ‹.

На самом Π΄Π΅Π»Π΅, precompiled headers вСсьма полСзная тСхнология. ΠŸΠΎΠ»ΡŒΠ·Ρƒ ΠΎΡ‚ Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Π΄Π°ΠΆΠ΅ Ссли Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ всСго нСсколько дСсятков Ρ„Π°ΠΉΠ»ΠΎΠ². ОсобСнно Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ становится Π·Π°ΠΌΠ΅Ρ‚Π΅Π½, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ тяТёлыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΊΠ°ΠΊ boost.

Всё это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ прСпроцСссор Π² компиляторС вновь ΠΈ вновь выполняСт ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ Ρ„Π°ΠΉΠ»Ρ‹, Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… Π΄Ρ€ΡƒΠ³ Π² Π΄Ρ€ΡƒΠ³Π°, Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ #ifdef Π²Π΅Ρ‚ΠΊΠΈ ΠΈ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ значСния макросов. ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ колоссальноС Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

МоТно сущСствСнно ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ объСм Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ прСпроцСссор ΠΏΡ€ΠΈ компиляции ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ИдСя Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΏΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΡƒ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π·Π°Ρ‚Π΅ΠΌ просто ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ тСкста.

На самом Π΄Π΅Π»Π΅, дСлаСтся Π΅Ρ‰Ρ‘ ряд шагов. МоТно Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π΅ просто тСкст, Π° Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Π― Π½Π΅ знаю, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ устроСно Π² 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. Плюс выставлСны всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ компиляции.

Для всСх *.c/*.cpp Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ precompiled headers. Π­Ρ‚ΠΎΠ³ΠΎ ΠΌΠ°Π»ΠΎ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ #include Β«stdafx.hΒ».

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Β«stdafx.hΒ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² *.c/*.cpp Ρ„Π°ΠΉΠ» самым ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ! Π˜Π½Π°Ρ‡Π΅ всё Ρ€Π°Π²Π½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ ошибки компиляции.

Если ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Π² этом Π΅ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΠ°. Когда Ρ„Π°ΠΉΠ» Β«stdafx.hΒ» находится Π² самом Π½Π°Ρ‡Π°Π»Π΅, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡƒΠΆΠ΅ прСпроцСссированный тСкст. Π­Ρ‚ΠΎΡ‚ тСкст всСгда ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ² ΠΈ Π½ΠΈ ΠΎΡ‚ Ρ‡Π΅Π³ΠΎ Π½Π΅ зависит.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, Ссли Π±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΄ΠΎ Β«stdafx.hΒ» Π΅Ρ‰Ρ‘ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Ρ„Π°ΠΉΠ». А Π² этом Ρ„Π°ΠΉΠ»Π΅ Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ ΠΈ напишСм: #define bool char. Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ. ΠœΡ‹ мСняСм содСрТимоС всСх Ρ„Π°ΠΉΠ»ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… упоминаСтся Β«boolΒ». Π’Π΅ΠΏΠ΅Ρ€ΡŒ просто Ρ‚Π°ΠΊ нСльзя Π²Π·ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅ прСпроцСссированный тСкст. ЛомаСтся вСсь ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Β«precompiled headersΒ». Π”ΡƒΠΌΠ°ΡŽ, это ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Β«stdafx.hΒ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ располоТСн Π² Π½Π°Ρ‡Π°Π»Π΅. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

Life hack

ΠŸΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ #include Β«stdafx.hΒ» Π²ΠΎ всС *.c/*.cpp Ρ„Π°ΠΉΠ»Ρ‹ достаточно ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈ Π½Π΅ интСрСсно. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ получится рСвизия Π² систСмС контроля вСрсий, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство Ρ„Π°ΠΉΠ»ΠΎΠ². ΠΠ΅Ρ…ΠΎΡ€ΠΎΡˆΠΎ.

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎ нСудобство Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² Π²ΠΈΠ΄Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ² с ΠΊΠΎΠ΄ΠΎΠΌ. ΠŸΡ€Π°Π²ΠΈΡ‚ΡŒ эти Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅Ρ‚ смыла. По ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌΡƒ для Π½ΠΈΡ… Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ использованиС Β«precompiled headersΒ». Однако, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСсколько ΠΌΠ΅Π»ΠΊΠΈΡ… сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, это Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚ постоянно спотыкаСтся ΠΎΠ± precompiled headers.

Π•ΡΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ precompiled headers Π»Π΅Π³ΠΊΠΎ ΠΈ просто. Бпособ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚ Π½Π΅ Π²Π΅Π·Π΄Π΅ ΠΈ всСгда, Π½ΠΎ ΠΌΠ½Π΅ ΠΎΠ½ часто ΠΏΠΎΠΌΠΎΠ³Π°Π».

МоТно Π½Π΅ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π²ΠΎ всС Ρ„Π°ΠΉΠ»Ρ‹ #include Β«stdafx.hΒ», Π° Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ Β«Forced Included FileΒ».

Π˜Π΄Ρ‘ΠΌ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡƒ настроСк Β«AdvancedΒ». Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ всС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π’ ΠΏΠΎΠ»Π΅ Β«Forced Included FileΒ» пишСм:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Β«stdafx.hΒ» автоматичСски Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² Π½Π°Ρ‡Π°Π»ΠΎ Π’Π‘Π•Π₯ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². PROFIT!

Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π½Π΅ потрСбуСтся ΠΏΠΈΡΠ°Ρ‚ΡŒ #include Β«stdafx.hΒ» Π² Π½Π°Ρ‡Π°Π»Π΅ всСх *.c/*.cpp Ρ„Π°ΠΉΠ»ΠΎΠ². ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ сдСлаСт это сам.

Π§Ρ‚ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² stdafx.h

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Π‘Π΅Π·Π΄ΡƒΠΌΠ½ΠΎΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² Β«stdafx.hΒ» всСго подряд Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ ускорит ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Π½ΠΎ ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ‚ Π΅Ρ‘.

ВсС Ρ„Π°ΠΉΠ»Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Β«stdafx.hΒ», зависят ΠΎΡ‚ Π΅Π³ΠΎ содСрТимого. ΠŸΡƒΡΡ‚ΡŒ Π² Β«stdafx.hΒ» Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Ρ„Π°ΠΉΠ» Β«X.hΒ». Если Π²Ρ‹ помСняСтС Ρ…ΠΎΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² Β«X.hΒ», это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»Π΅Ρ‡ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ всСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ. Π’ΠΊΠ»ΡŽΡ‡Π°ΠΉΡ‚Π΅ Π² Β«stdafx.hΒ» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠžΠ§Π•ΠΠ¬ Ρ€Π΅Π΄ΠΊΠΎ. Π₯ΠΎΡ€ΠΎΡˆΠΈΠΌΠΈ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ систСмных ΠΈ сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

Если Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚Π΅ Π² Β«stdafx.hΒ» собствСнныС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΡΠΎΠ±Π»ΡŽΠ΄Π°ΠΉΡ‚Π΅ Π΄Π²ΠΎΠΉΠ½ΡƒΡŽ Π±Π΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π’ΠΊΠ»ΡŽΡ‡Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ-ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π΅Π΄ΠΊΠΎ.

Если ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ *.h Ρ„Π°ΠΉΠ» мСняСтся Ρ€Π°Π· Π² мСсяц, это ΡƒΠΆΠ΅ слишком часто. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ€Π΅Π΄ΠΊΠΎ удаётся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ всС ΠΏΡ€Π°Π²ΠΊΠΈ Π² h-Ρ„Π°ΠΉΠ»Π΅ с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ€Π°Π·Π°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ трСбуСтся 2-3 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. Π‘ΠΎΠ³Π»Π°ΡΠΈΡ‚Π΅ΡΡŒ, 2-3 Ρ€Π°Π·Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вСсь ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ β€” занятиС нСприятноС. Плюс полная пСрСкомпиляция потрСбуСтся всСм вашим ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌ.

НСсколько Precompiled Headers

Π—Π°Ρ‡Π΅ΠΌ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ нСсколько precompiled headers? Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, это Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ часто. Но ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ ΠΏΠ°Ρ€Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ *.c ΠΈ *.cpp Ρ„Π°ΠΉΠ»Ρ‹. Для Π½ΠΈΡ… нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ *.pch Ρ„Π°ΠΉΠ». ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ.

НуТно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π²Π° *.pch Ρ„Π°ΠΉΠ»Π°. Один Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ C-Ρ„Π°ΠΉΠ»Π° (xx.c), Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ C++-Ρ„Π°ΠΉΠ»Π° (yy.cpp). БоотвСтствСнно, Π² настройках Π½Π°Π΄ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π‘-Ρ„Π°ΠΉΠ»Π°Ρ… использовался ΠΎΠ΄ΠΈΠ½ precompiled header, Π° Π² Π‘++-Ρ„Π°ΠΉΠ»Π°Ρ… β€” Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° для *.pch Ρ„Π°ΠΉΠ»ΠΎΠ². Π˜Π½Π°Ρ‡Π΅ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ‚ΠΈΡ€Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

Другая ситуация. Одна Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½Ρƒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, Π° другая Ρ‡Π°ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

ЕстСствСнно, Π½Π΅ стоит всСм участкам ΠΊΠΎΠ΄Π° Π·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ ΠΎΠ±Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’ (Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹Ρ…) Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°Ρ‚ΡŒΡΡ ΠΈΠΌΠ΅Π½Π° ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ сущностСй.

Π›ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄Π²Π° precompiled headers ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² Ρ€Π°Π·Π½Ρ‹Ρ… участках ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Как ΡƒΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ *.pch Ρ„Π°ΠΉΠ»Ρ‹. Π”Π° ΠΈ имя *.pch Ρ„Π°ΠΉΠ»Π° Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ. Всё это, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, трСбуСтся Π΄Π΅Π»Π°Ρ‚ΡŒ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ, Π½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ слоТного Π² использовании Π΄Π²ΡƒΡ… precompiled headers Π½Π΅Ρ‚.

Π’ΠΈΠΏΠΎΠ²Ρ‹Π΅ ошибки ΠΏΡ€ΠΈ использовании Precompiled Headers

ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π² Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π²Ρ‹ΡˆΠ΅, Π²Ρ‹ смоТСтС ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ ошибки, связанныС с stdafx.h. Но Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΅Ρ‰Ρ‘ Ρ€Π°Π· пройдёмся ΠΏΠΎ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹ΠΌ ошибкам компиляции ΠΈ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ ΠΈΡ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΡŒΠ΅ β€” ΠΌΠ°Ρ‚ΡŒ ΡƒΡ‡Π΅Π½ΡŒΡ.

Fatal error C1083: Cannot open precompiled header file: ‘Debug\project.pch’: No such file or directory

Fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add ‘#include Β«stdafx.hΒ»’ to your source?

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ само Π·Π° сСбя, Ссли Π΅Π³ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ. Π€Π°ΠΉΠ» компилируСтся с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ /Yu. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ precompiled header. Но Π² Ρ„Π°ΠΉΠ» Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Β«stdafx.hΒ».

НуТно Π²ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ» #include Β«stdafx.hΒ».

Если это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎ слСдуСт Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ precompiled header для этого *.c/*.cpp Ρ„Π°ΠΉΠ»Π°. Π£Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ /Yu.

Fatal error C1853: ‘project.pch’ precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C (or vice versa)

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΊΠ°ΠΊ C (*.c), Ρ‚Π°ΠΊ ΠΈ C++ (*.cpp) Ρ„Π°ΠΉΠ»Ρ‹. Для Π½ΠΈΡ… нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ precompiled header (*.pch Ρ„Π°ΠΉΠ»).

Из-Π·Π° precompiled header компилятор Π³Π»ΡŽΡ‡ΠΈΡ‚

Π‘ΠΊΠΎΡ€Π΅Π΅ всСго, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ сдСлано Π½Π΅ Ρ‚Π°ΠΊ. НапримСр, #include Β«stdafx.hΒ» располоТСн Π½Π΅ Π² самом Π½Π°Ρ‡Π°Π»Π΅.

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π΅ скомпилируСтся. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ выдаст Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд странноС сообщСниС ΠΎΠ± ошибкС:

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ считаСт, Ρ‡Ρ‚ΠΎ всС, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π΄ΠΎ строчки #include Β«stdafx.hΒ» (Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ), являСтся precompiled header. ΠŸΡ€ΠΈ компиляции Ρ„Π°ΠΉΠ»Π° компилятор Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ всС, Ρ‡Ρ‚ΠΎ Π΄ΠΎ #include Β«stdafx.hΒ» Π½Π° тСкст ΠΈΠ· *.pch Ρ„Π°ΠΉΠ»Π°. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ тСряСтся строчка Β«int A = 10Β».

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„Π°ΠΉΠ»Π° Β«my.hΒ» Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, нСльзя Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² этом Ρ„Π°ΠΉΠ»Π΅. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΡ‡Π΅Π½ΡŒ сбиваСт программистов с Ρ‚ΠΎΠ»ΠΊΡƒ. Они Β«Π»Π΅Ρ‡Π°Ρ‚Β» Π΅Π³ΠΎ ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ precompiled headers ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π±Π°ΠΉΠΊΠΈ ΠΎ Π³Π»ΡŽΡ‡Π½ΠΎΡΡ‚ΠΈ Visual C++. Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, компилятор β€” это ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ€Π΅Π΄ΠΊΠΎ Π³Π»ΡŽΡ‡Π°Ρ‰ΠΈΡ… инструмСнтов. Π’ 99.99% случаСв Π½Π°Π΄ΠΎ Π½Π΅ Π·Π»ΠΈΡ‚ΡŒΡΡ Π½Π° компилятор, Π° ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Ρƒ сСбя (Proof).

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ‚Π°ΠΊΠΈΡ… ситуаций Π½Π΅ Π±Ρ‹Π»ΠΎ, ВБЕГДА ΠΏΠΈΡˆΠΈΡ‚Π΅ #include Β«stdafx.hΒ» Π² самом Π½Π°Ρ‡Π°Π»Π΅ Ρ„Π°ΠΉΠ»Π°. ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ #include Β«stdafx.hΒ» ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ. Они всё Ρ€Π°Π²Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‚ Π² компиляции.

Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Forced Included File. Π‘ΠΌ. Π²Ρ‹ΡˆΠ΅ Ρ€Π°Π·Π΄Π΅Π» Β«Life hackΒ».

Из-Π·Π° precompiled headers ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ постоянно пСрСкомпилируСтся Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ

Π’ stdafx.h Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рСгулярно рСдактируСтся. Или случайно Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π°Π²Ρ‚ΠΎΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ».

Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ содСрТимоС Ρ„Π°ΠΉΠ»Π° Β«stdafx.hΒ». Π’ Π½Π΅Π³ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊΡ€Π°ΠΉΠ½Π΅ Ρ€Π΅Π΄ΠΊΠΎ. Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, Π½ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ½ΠΈ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ *.h Ρ„Π°ΠΉΠ»Ρ‹.

Вворится Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ нСпонятноС

Иногда ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ситуация, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΠ»ΠΈ ΠΊΠΎΠ΄, Π° ошибка Π½Π΅ исчСзаСт. ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ нСпонятныС Π²Π΅Ρ‰ΠΈ.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ *.pch Ρ„Π°ΠΉΠ». Как-Ρ‚ΠΎ Ρ‚Π°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ компилятор Π½Π΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ измСнСния Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π½Π΅ пСрСстраиваСт *.pch Ρ„Π°ΠΉΠ». Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, подставляСтся старый ΠΊΠΎΠ΄. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, это происходило ΠΈΠ·-Π·Π° ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ сбоСв, связанных с Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ².

Π­Ρ‚ΠΎ ΠžΠ§Π•ΠΠ¬ рСдкая ситуация. Но ΠΎΠ½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΈ ΠΏΡ€ΠΎ Π½Π΅Ρ‘ Π½Π°Π΄ΠΎ Π·Π½Π°Ρ‚ΡŒ. Π― Π·Π° ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π³ΠΎΠ΄Ρ‹ программирования сталкивался с Π½Π΅ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 2-3 Ρ€Π°Π·Π°. ΠŸΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ полная пСрСкомпиляция ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ precompiled headers Π½Π΅ удаётся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PVS-Studio

Π­Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ частая ситуация, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊ Π½Π°ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Ρ‹ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ: «Π£ΡΡ‚Ρ€Π°Π½Π΅Π½ΠΈΠ΅ нСисправностСй ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ PVS-Studio». Π—Π΄Π΅ΡΡŒ ΠΎΠΏΠΈΡˆΡƒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΊΡ€Π°Ρ‚ΠΊΠΎ.

Если Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ (solution) компилируСтся, это вовсС Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ устроСно. Часто ΠΎΠ΄Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ (solution) содСрТит мноТСство ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ свои precompiled headers (имССтся свой stdafx.h ΠΈ stdafx.cpp).

Π’ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΠ³Π΄Π° Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· сосСднСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ Ρ‚Π°ΠΊ часто дСлаСтся. Π’ΠΎΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π±Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Π² *.cpp Ρ„Π°ΠΉΠ»Π΅ написано: #include Β«stdafx.hΒ».

И, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· stdafx.h подхватится, это интСрСсный вопрос. Но Ρ€Π°Π· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° компилируСтся β€” программисту Π²Π΅Π·Ρ‘Ρ‚.

К соТалСнию, Π½Π°ΠΌ слоТно ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ использовании *.pch Ρ„Π°ΠΉΠ»Π°. «ЧСстный» прСпроцСссор Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ.

Π’ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ solution, Π½Π° самом Π΄Π΅Π»Π΅, устроСн Π½Π΅ Π²Π΅Ρ€Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠ² precompiled headers. Π‘Ρ€Π°Π·Ρƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π»Π΅Π·Ρ‚ΠΈ масса интСрСсных ошибок, ΠΈ программист Π±ΡƒΠ΄Π΅Ρ‚ искрСннС ΡƒΠ΄ΠΈΠ²Π»ΡΡ‚ΡŒΡΡ, ΠΊΠ°ΠΊΠΈΠΌ ΠΆΠ΅ Ρ‡ΡƒΠ΄ΠΎΠΌ компилировался Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

Π—Π° подробностями вновь дСлаю отсылку ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. Плюс, Ссли Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ всё Ρ€Π°Π²Π½ΠΎ Π½Π΅ ясно, ΠΌΡ‹ подскаТСм Π² ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Как Π²Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, Π½ΠΈΡ‡Π΅Π³ΠΎ слоТного Π² precompiled headers Π½Π΅Ρ‚. ВсС «многочислСнныС глюки компилятора», с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ сталкиваСтся программист ΠΏΡ€ΠΈ ΠΈΡ… использовании, Π½Π° самом Π΄Π΅Π»Π΅, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹. НадСюсь, эта ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅.

Precompiled headers ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΌ сущСствСнно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ компиляции ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *