Domanda

Sto giocando intorno con Box2D per il divertimento in questo momento, e dopo avere ottenuto il blocco di alcuni dei concetti ho deciso di fare il mio test per il banco di prova (Box2D viene fornito con una serie di esempi e ha un semplice test estensibile classe per rendere i propri test). Ho iniziato afferrando uno degli altri test, strappandogli tutto, ma le firme di funzione, e l'inserimento di alcuni dei miei codice.

Tuttavia, non ci sono #includes a qualsiasi delle librerie di Box2D in modo che non si compila (ma solo i miei errori di file, rimuovere il mio file di prova e compila bene). Ho pensato che devo avere accidentalmente cancellati quando stavo spostando i dati, ma al momento del check gli altri file di test non c'è #includes ovunque per essere visto. Ognuno dei file utilizza Datastructures e le funzioni che vengono dichiarate in vari file di intestazione Box2D. Come funziona questo compilare a tutti?

Per esempio, questo è uno dei test preconfezionati spogliato del corpo del costruttore e alcuni commenti in alto:

#ifndef CHAIN_H
#define CHAIN_H

class Chain : public Test
{
public:
    Chain()
    {
        // Since b2BodyDef isn't defined in this file, and no 
        // other files are included how does this even compile?
        b2BodyDef bd; 


        // rest of constructor...
    }

    static Test* Create()
    {
        return new Chain;
    }
};
#endif
È stato utile?

Soluzione

Ogni file cpp viene compilato. Prima di essere compilato, però, il preprocessore corre. Le offerte preprocesser con tutte le parole chiave a partire dal numero, come #include. Il preprocessore prende il testo di ogni file # include'd e sostituisce l'istruzione #include con tutto il testo nel file che include. Se il file # include'd include altri file, il loro testo viene recuperato anche.

Dopo che il preprocessore ha eseguito, si finisce con un grande file di testo chiamato grande un'unità di traduzione. Questo è ciò che viene compilato.

Quindi .. probabilmente come altre persone hanno detto. Il file cpp include da qualche parte la roba Box2D prima che comprende chain.h, quindi tutto funziona. C'è spesso un'opzione sul compilatore o le impostazioni del progetto che otterrà il preprocessore per creare un file con tutto il testo in unità di traduzione in modo da poter vedere. Questo a volte è utile per rintracciare gli errori con #includes o le macro.

Altri suggerimenti

Forse il l'intestazione che fa definire b2BodyDef è #include nel cpp prima di questo colpo di testa? Ci sono ovviamente altre intestazioni coinvolti, altrimenti non sarebbe in grado di fare riferimento a class Test.

Il #ifndef CHAIN_H all'inizio è un modello comune che indica a me che questo è da un file chiamato chain.h.

I file header come il <=> che stai citando, non sono destinati ad essere stand-alone compilabile. Molto probabilmente è necessario per creare un semplice C ++ - il file che include questo e gli altri file necessari prima che:

test.cpp:

#include "box2d.h"
#include "chain.h"

// more code here.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top