2013-04-16 16 views
6

Korzystanie z Visual C++ 2012, bez nagłówków prekompilowanymi:Header nie odświeżane - Visual C++ 2012

Kiedy zmienić nagłówek pliku, który znajduje się w wielu plików, zmiana nie jest brany pod uwagę przy budowaniu. Jeśli przebuduję wszystko, zmiana zostanie uwzględniona.

przypadku reprodukcji:

include.h

#ifndef INCLUDE_H_ 
#define INCLUDE_H_ 

class A { 
public: 
    A(int i) : i_(i) { } 
    int i_; 
}; 

class B { 
public: 
    B(int i = 1) : a_(i) { } 
    A a_; 
}; 

#endif INCLUDE_H_ 

dummy.cpp

#include "include.h" 

main.cpp

#include <iostream> 
#include "include.h" 

int main(int, char**) { 
    B b; 
    std::cout << b.a_.i_ << std::endl; 
    return 0; 
} 

ten wyprowadza 1.

Teraz mogę zmienić int i = 1 do int i = 2 w include.h; Buduję i biegam, wyprowadza 1! ja odbudować i biegać, wyprowadza 2.

  • dummy.cpp plik jest niezbędny do odtworzenia błędu. W rzeczywistości ten plik używa include.h, ale nie klasy A i B (ale to nie wydaje się niczego zmieniać, deklarowanie klasy C z elementami A i B w dummy.cpp nadal będzie odtwarzać problem). Podczas usuwania pliku dummy.cpp lub zmiany nazwy na zdummy.cpp (prawdopodobnie zostanie skompilowany po main.cpp), problem zniknie.

  • Próbowałem z włączonymi strażnikami, z pragma raz, z obiema, z żadnym z nich, problem jest reprodukowany w każdym przypadku.

  • Nie mogę odtworzyć tego problemu z Code :: Blocks/GCC; Nie próbowałem używać starszych wersji Visual Studio.

Czy brakuje mi czegoś lub czy jest to naprawdę błąd w Visual Studio? Jeśli to drugie, czy istnieje znane obejście tego problemu? (Inne niż re -building na każdym kroku)

+0

Zakładam, że zapisałeś zmiany przed rozpoczęciem budowy (i/lub włączyłeś opcję "automatycznie zapisuj wszystkie pliki przed rozpoczęciem budowy")? –

+0

Co ciekawe, nie ma takiej opcji w Visual Studio 2012. Upewniłem się, że moje zmiany zostały zapisane przed _buiding_ lub _rebuilding all_. Próbowałem również nie zapisywać przed budowaniem lub odbudowywaniem, ale to oszczędza dla mnie, ponieważ widzę * z prawej strony nazwy pliku w karcie znika. – bonob

Odpowiedz

2

Plik nagłówkowy musi być częścią projektu. Jeśli nie, projekt nadal będzie budowany, tzn. Kompilator może go znaleźć, ale Visual Studio nie będzie śledzić daty pliku.

+0

Plik nagłówkowy jest częścią projektu. – bonob

+0

@ 3li3, czy to oznacza, że ​​pojawia się w "Plikach nagłówka" w Eksploratorze rozwiązań? –

+0

Tak, robi, a mój projekt reprodukcji jest tworzony od zera, dodałem wszystkie 3 pliki z projektu. – bonob

0

Przeszłam przez coś takiego w przeszłości.

Czy używasz prekompilowanych nagłówków? Jeśli to zrobisz, usuń wszystkie nagłówki specyficzne dla projektu z PCH. To jest kiepski błąd. Umieszczaj tylko zewnętrzne, niezmienne nagłówki w PCH, takie jak standardowe nagłówki C/C++, nagłówki Windows, Zwiększenie itp.

+0

Cóż, mówienie pytającemu, że popełniono "kulawy błąd", nie jest zbyt uprzejme. –

+0

Nie używam prekompilowanych nagłówków. Miałem wrażenie, że to może być przyczyna, ale upewniłem się kilka razy, że prekompilowane nagłówki są poza równaniem. – bonob

+0

lol. Zrobiłem to w przeszłości. To nie jego wina. Jeśli kiedykolwiek zrobi to ponownie: P PCH buduje o wiele szybciej, ale może być ból w **, gdy jest to niewłaściwe. –