2013-04-16 10 views
6

utilizzando Visual C++ 2012, senza intestazioni precompilate:Header non rinfrescato - Visual C++ 2012

Quando cambio un file di intestazione che è incluso in più file, la modifica non viene preso in considerazione quando si costruisce. Se si ricostruisce tutto, la modifica viene presa in considerazione.

caso Riproduzione:

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; 
} 

Emette 1.

Ora posso cambiare int i = 1-int i = 2 in include.h; Io costruisco ed eseguo, emette 1! Ho ricostruire e corro, emette 2.

  • Il dummy.cpp file è necessario per riprodurre l'errore. Nella vita reale, questo file utilizza include.h ma non le classi A e B (ma questo non sembra cambiare nulla, dichiarando una classe C con membri A e B in dummy.cpp continuerà a riprodurre il problema). Quando si rimuove il file dummy.cpp o rinominandolo in zdummy.cpp (presumibilmente verrà compilato dopo main.cpp), quindi il problema scompare.

  • Ho provato con le protezioni incluse, con una volta sola pragma, con entrambe, con nessuna di esse, il problema è riprodotto in ogni caso.

  • Non riesco a riprodurre questo problema con Code :: Blocks/GCC; Non ho provato con le versioni precedenti di Visual Studio.

Mi manca qualcosa o si tratta di un bug in Visual Studio? Se quest'ultimo, c'è una soluzione nota? (Altro di re -building in ogni fase)

+0

Presumo che hai salvato le modifiche prima di costruire (e/o abilitato l'opzione "salva automaticamente tutti i file prima della creazione")? –

+0

È interessante notare che non è disponibile questa opzione in Visual Studio 2012. Mi sono assicurato che le mie modifiche siano state salvate prima di _buiding_ o _rebuilding all_. Ho anche provato a non salvare prima di costruire o ricostruire, ma mi salva, dal momento che posso vedere il * a destra del nome del file nella scheda scomparire. – bonob

risposta

2

Il file di intestazione deve far parte del progetto. Se non lo è, il progetto verrà comunque creato e il compilatore potrà trovarlo, ma Visual Studio non traccerà la data del file.

+0

Il file di intestazione fa parte del progetto. – bonob

+0

@ 3li3, significa che compare in "File di intestazione" in Esplora soluzioni? –

+0

Sì, lo fa, e il mio progetto di riproduzione è stato creato da zero, ho aggiunto tutti e 3 i file all'interno del progetto. – bonob

0

Ho passato una cosa del genere in passato.

Utilizzi intestazioni precompilate? Se lo fai, rimuovi eventuali intestazioni specifiche del progetto dal PCH. Questo è un errore zoppo. Posiziona solo intestazioni esterne, non modificabili in PCH, come intestazioni standard C/C++, intestazioni Windows, Boost ecc.

+0

Bene, dire al richiedente che hanno fatto un "errore zoppo" non è molto educato. –

+0

Non utilizzo intestazioni precompilate. Ho avuto la sensazione che questa potesse essere la causa, ma mi sono assicurato più volte che le intestazioni precompilate erano fuori dall'equazione. – bonob

+0

lol. L'ho fatto in passato. Non è colpa sua. Lo farà se lo farà mai più: P PCH rende le build molto più veloci ma può essere un dolore nella a ** quando non è giusto. –

Problemi correlati