2009-08-24 5 views
5

Jeśli umieściłem nagłówek (ah) w stdafx.h, a ten nagłówek zawiera inny nagłówek (bh), który nie jest wymieniony w stdafx.h, będzie odwiedzany za każdym razem, gdy ktoś zawiera ah lub czy jest on skompilowany jako część ah? Jeśli jest on wkompilowany w a.h, co się dzieje, gdy ktoś włącza bezpośrednio b.h? Czy zostanie to skompilowane, czy nie?Pytanie o prekompilowane nagłówki w Visual C++

Moja motywacja do zadawania tego pytania polega na tym, że staram się zoptymalizować zawartość plików stdafx.h dla oprogramowania, nad którym pracuję. Zarówno odbudowa, jak i przyrostowe czasy budowy są dla nas ważne. Zastanawiam się, czy mogę po prostu przeszukać wszystkie pliki .cpp dla dyrektyw #include i policzyć liczbę załączeń każdego pliku. Pliki, które były często dołączane, mogą być dobrymi kandydatami do pliku stdafx.h. Oczywiście ta strategia jest całkowicie nieprawdziwa, jeśli muszę wziąć pod uwagę nie tylko to, które pliki są dołączone, ale także to, które pliki zawierają dołączone pliki.

Wątpię, jest to ważne, ale są przy użyciu Visual Studio 2005.

+0

PROSZĘ Głosuj: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4931119-allow-precompiled-headers-to-be-shared-between-pro –

Odpowiedz

4

A.H i B.H. będzie częścią skompilowanym nagłówka, i nie ma potrzeby, aby włączyć je później. Wszystko, czego potrzebujesz, to stdafx.h, gdzie wymagane są a.h lub b.h. Jeśli będziesz zawierał ah lub bh jawnie po stdafx.h (cały kod przed tym, jak stdafx.h zostanie zignorowany), to nie zostanie skompilowany po raz drugi (tylko dlatego, że są zwykle chronione przez dyrektywę lub definicje #pragma once), ale kompilator otworzy ten plik na dysku twardym, jeśli o to pytasz,

Przy okazji, powinieneś wiedzieć, że możesz użyć kilku skompilowanych plików nagłówkowych (ale nie więcej niż jednego w każdym pliku cpp).

+3

Co można powiedzieć o w tym ah lub bh po stdafx.h jest technicznie prawdą - kompilator ponownie spojrzy na nagłówki - ale większość nagłówków używa #pragma raz lub zawiera strażników, aby temu zapobiec. W rzeczywistości, polecam zawarcie a.h i b.h wszędzie tam, gdzie są potrzebne, nawet jeśli a.h jest w stdafx.h - w przeciwnym razie nie będzie można modyfikować zawartości stdafx.h później bez uruchamiania się w nieskończoną listę błędów kompilacji. –

+0

Tak, nie zostaną skompilowane, ale zostaną one technicznie otwarte przez kompilator. –

+1

Zgadzam się, że pomysł Nicka jest pomocny, ale po prostu boję się, że wystąpi wydajność, ponieważ musimy wykonać dodatkowe IO na dysku, aby stwierdzić, że istnieje #progma –