2015-08-24 10 views
7

Per esempio io ho due file header.h situati in due diverse directory include1 e include2. mio file di codice sorgente utilizza l'inserimento regolare che non specifica la posizione esatta, in questo modo:Come imporre l'ordine di ricerca dei file include aggiuntivi nel progetto VC++?

#include "header.h" 

Nella configurazione di progetto ho impostato il mio sia include1 e include2 cartelle da includere nel supplementare directory elenco.

Il problema è quando si crea il mio progetto, la cartella include1 viene selezionata ogni volta, indipendentemente dall'ordine che ho definito nell'elenco di inclusione aggiuntivo.

C'è un modo per far rispettare un ordine di ricerca, se voglio una cartella specifica, o un file di intestazione specifico da utilizzare, invece di un altro, se entrambi hanno lo stesso nome di file?

+0

Probabilmente questa ambiguità dovrebbe essere risolta in altri modi. Cosa succede se si desidera utilizzare entrambe le intestazioni nello stesso progetto? Ad esempio, se li inseriresti in una directory, risolverebbe questo problema. Quindi ci sarebbe un #include "Folder1 \ header.h" e la versione Folder2, – Melkon

+0

Quello che sto cercando di ottenere è la sostituzione di un file di intestazione del progetto C esistente, con un file di intestazione del mio, senza toccare i file originali (quindi nessun ifdefs nell'intestazione originale e nessuna modifica delle direttive #include nelle fonti). Il modo semplice è di non utilizzare la directory con quel file di intestazione originale, ma ha alcuni altri file di intestazione originale che non è necessario sostituire. – user1483597

+0

Esiste un'impostazione di progetto "Directory C++" che probabilmente viene cercata prima delle "directory aggiuntive". Se aggiungi il tuo 'Folder1' prima nella lista principale, sarà sicuramente cercato per primo. –

risposta

9

L'includono ordine (come documented da MS) è:

Il compilatore ricerca per le directory nel seguente ordine: 1.
directory contenenti i file di origine.
2. Directory specificate con l'opzione/I, nell'ordine in cui CL le incontra.
3. Directory specificate nella variabile di ambiente INCLUDE.

Quindi dipende davvero da dove vengono dichiarate le directory di inclusione. Se entrambi sono specificati con l'opzione/I (nella GUI in Proprietà di configurazione> C/C++> Generale> Directory di inclusione aggiuntive), l'ordine specificato è l'ordine cercato. Se le directory si trovano nella variabile di ambiente INCLUDE (nella GUI in Proprietà di configurazione> Directory VC++), dipende da dove vengono dichiarate. Se è presente nelle schede delle proprietà, è necessario il non ereditarli e dichiararli (e altre directory ereditate) nell'ordine desiderato.

0

Penso che il tuo problema sarà difficile da risolvere. Sospetto che header.h sia incluso da un file nella cartella include1.

Ciò significa che la norma C include il percorso è

  1. Directory del (o file di intestazione che include una sub file) file sorgente.
  2. L'ordine definito dalla riga di comando include.

Quindi per risolvere questo problema, dovremmo essere in grado di interrompere (in qualche modo) la regola 1 dal licenziamento.

L'uso di #include "projecta/header.h" e #include "projectb/header.h" sono metodi normali per ottenere ciò, se non si è interessati alla modifica della sorgente.

Nel tuo caso, si vuole garantire il vostro (include2 è inclusa.)

metodi si potrebbe applicare.

Se il codice precedente (file .c/.cpp) è modificabile, assicurati di avere #include "include2/header.h" - which should also set up so all requirements for include1/header.h`.

se include1/header.h ha una guardia di includere (#if ! defined(H_HEADER_H)) quindi definire questo nella riga di comando (/DH_HEADER_H), in modo che non è incluso - questo è un salto nel buio, in quanto il file non sarà raggiungere il suo scopo.

Scrivere uno script di modifica del testo (sed?) Per modificare "header.h" come "include2/header.h" - che garantisce che tutte le occorrenze nell'origine scelgano la propria versione. Non si tratta di una specifica specifica, ma potrebbe essere concepita come lasciando la fonte invariata, in quanto sarebbe un passo precompilato.

L'obiettivo per garantire il cambiamento dell'ordine di inclusione può essere ottenuto creando 2 progetti separati, uno che utilizza include1/header.h e il codice originale invariato. Quindi offre include2/header.h come interfaccia che viene modificata in qualche modo.

Problemi correlati