لماذا نستخدم الرؤوس المترجمة مسبقًا (C/C++)؟

StackOverflow https://stackoverflow.com/questions/903228

  •  05-09-2019
  •  | 
  •  

سؤال

لماذا تستخدم الرؤوس المترجمة مسبقًا؟


عند قراءة الردود، أظن أن ما كنت أفعله معهم هو نوع من الغباء:

#pragma once

// Defines used for production versions

#ifndef PRODUCTION
#define eMsg(x) (x) // Show error messages
#define eAsciiMsg(x) (x)
#else
#define eMsg(x) (L"") // Don't show error messages
#define eAsciiMsg(x) ("")
#endif // PRODUCTION

#include "targetver.h"
#include "version.h"

// Enable "unsafe", but much faster string functions
#define _CRT_SECURE_NO_WARNINGS
#define _SCL_SECURE_NO_WARNINGS

// Standard includes
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <direct.h>
#include <cstring>
#ifdef _DEBUG
#include <cstdlib>
#endif

// Standard Template Library
#include <bitset>
#include <vector>
#include <list>
#include <algorithm>
#include <iterator>
#include <string>
#include <numeric>

// Boost libraries
#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/scoped_array.hpp>

//Windows includes
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "FILETIME_Comparisons.h"
#include <shlwapi.h>
#include <Shellapi.h>
#include <psapi.h>
#include <imagehlp.h>
#include <mscat.h>
#include <Softpub.h>
#include <sfc.h>
#pragma comment(lib, "wintrust.lib")
#pragma comment(lib,"kernel32.lib")
#pragma comment(lib,"Psapi.lib")
#pragma comment(lib,"shlwapi.lib")
#pragma comment(lib,"imagehlp.lib")
#pragma comment(lib,"Advapi32.lib")
#pragma comment(lib,"Shell32.lib")
#pragma comment(lib,"Sfc.lib")
#pragma comment(lib,"Version.lib")

// Crypto ++ libraries
#ifdef _DEBUG
#pragma comment(lib,"cryptlibd.lib")
#else
#pragma comment(lib,"cryptlib.lib")
#endif
#define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1
#include <md5.h>
#include <sha.h>

// String libraries
#include "stringUnicodeConversions.h"
#include "expandEnvStrings.h"
#include "randomString.h"
#include "getShortPathName.h"

// Regular Expression Libraries
#include "fpattern.h"

// File Result Record
#include "unixTimeToFileTime.h"
#include "fileData.h"

// Writer
#include "writeFileData.h"

// Criteria Structure System
#include "priorities.h"
#include "criterion.H"
#include "OPSTRUCT.H"
#include "regexClass.H"
#include "FILTER.h"

// Sub Programs Root Class
#include "subProgramClass.h"

// Global data
#include "globalOptions.h"

// Logger
#include "logger.h"

// Console parser
#include "consoleParser.h"

// Timeout handler
#include "timeoutThread.h"

// Zip library
#include "zip.h"
#include "unzip.h"
#include "zipIt.h"

// Scanner
#include "mainScanner.h"
#include "filesScanner.h"

// Sub Programs
#include "volumeEnumerate.h"
#include "clsidCompressor.h"
#include "times.h"
#include "exec.h"
#include "uZip.h"

// 64 bit support
#include "disable64.h"
هل كانت مفيدة؟

المحلول

انها تجمع أ كثيرا أسرع. C ++ تجميع يستغرق سنوات بدونها. حاول مقارنة بعض الوقت في مشروع كبير!

نصائح أخرى

في C / C ++، فإن آلية #include هي نسخة نصية من الملف المحدد في الملف الحالي. تشمل الرؤوس رؤوس أخرى (والتي تشمل رؤوس أخرى)، لذلك عند القيام بعشرات #include، يمكن أن تضيف عشرات الآلاف من خطوط C ++ إلى كل ملف CPP (أو CXX، C، أيا كان)، كل ما تحتاج إليه جمع في كل مرة. هذا يمكن أن يكون عنق الزجاجة مغرور للمشاريع الكبيرة.

يسرع الرؤوس المعتمدة في هذا الأمر من خلال تجميع كل رأس مرة واحدة، ثم بما في ذلك تلك الحالة المترجمة في CPP يتم تضمينها في.

إعادة: الاستخدام الحالي الخاص بك، إذا كان لديك هدف مع عدد كبير جدا من الملفات، فقد لا يزال قد يكون أسرع استخدام PCH بهذه الطريقة - حاول إيقاف تشغيلها لمعرفة ذلك. ذلك يعتمد: إذا كان لديك الكثير من رؤوس خاصة بك، وأنت تغييرها بشكل غير منتظم فقط، ولديك عدد كبير جدا من الملفات المصدر التي تتغير بشكل أكثر تواترا، فإن استخدام PCH الخاص بك سيقلل أوقات إعادة البناء.

لكن النصيحة العادية هي أن تضع الأشياء فقط في PCH التي لا تتغير أبدا، لأن هناك مرفقا معينا لإنتاج PCH نفسه. إذا كنت تؤدي إلى إيقاف تشغيل كل إعادة بناء (عن طريق التغيير والتبديل باستمرار من رؤوسك)، فإن استخدام PCH قد يجعل أبطأ Rebuild.

لذلك ليس عليك تجميعها في كل مرة تقوم فيها ببناء مشروعك. يتم استخدامها لرؤوس النظام التي لن يتغير.

إنه يسرع عملية التجميع.

عندما تقوم بتضمين رؤوس من مشاريع أخرى، لا تتوقع تغييرها.إذا قمت بوضعها في رأس مُترجم مسبقًا، فلن يلزم إعادة ترجمة هذا الرمز عند إجراء تغييرات على كود المصدر الخاص بك.وهذا يقلل من التجميع المتكرر للتعليمات البرمجية التي لم تتغير، مما يؤدي إلى تسريع وقت الترجمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top