Pregunta

Estoy jugando con Box2D para la diversión en este momento, y después de conseguir la caída de algunos de los conceptos que decidí hacer mi propia prueba para el banco de pruebas (Box2D viene con un conjunto de ejemplos y tiene una sencilla prueba extensible clase para hacer sus propias pruebas). Empecé por el acaparamiento de una de las otras pruebas, arrancando todo, pero las firmas de función, y la inserción de algunos de mi propio código.

Sin embargo, no hay # incluye a cualquiera de las bibliotecas de Box2D por lo que no se compila (pero sólo mis errores de archivos, eliminar mi archivo de prueba y se compila bien). Pensé que debo tener accidentalmente eliminados cuando me estaba moviendo cosas de un lado, pero al hacer el registro de los otros archivos de prueba que no hay #includes en cualquier lugar para ser visto. Cada uno de los archivos utiliza estructuras de datos y funciones que se declaran en varios archivos de cabecera Box2D. ¿Cómo compilar esto en absoluto?

Por ejemplo, esta es una de las pruebas en envases previos despojados del cuerpo constructor y algunos comentarios en la parte superior:

#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
¿Fue útil?

Solución

Cada archivo CPP se compila. Antes de que se compila sin embargo, el preprocesador se ejecuta. Las ofertas preprocesser con todas las palabras que empiezan por #, como # include. El preprocesador toma el texto de cualquier # archivos include'd y sustituye a la instrucción # include con todo el texto en el archivo que incluye. Si el archivo # include'd incluye otros archivos, su texto se fue a buscar también.

Después de que el preprocesador se ha quedado, se termina con un gran archivo de texto grande se llama una unidad de traducción. Esto es lo que se compila.

Así que .. probablemente como otras personas han dicho. El archivo CPP incluye alguna parte del material Box2D antes de que incluye chain.h, así que todo funciona. A menudo hay una opción en el compilador o la configuración del proyecto que tendrá el preprocesador para crear un archivo con todo el texto en la unidad de traducción para que pueda verlo. Esto a veces es útil para el diagnóstico de problemas con #includes o macros.

Otros consejos

Tal vez el la cabecera que hace definir b2BodyDef se #include en el .cpp antes de esta cabecera? Obviamente, hay otras cabeceras involucrados, o que no serían capaces de hacer referencia a la clase de prueba.

El #ifndef CHAIN_H al comienzo es un patrón común que me indica que se trata de un archivo llamado chain.h.

Los archivos de cabecera como el <=> que está citando no pretenden ser compilables independiente. Lo más probable es que necesita para crear un simple C ++ - archivo que incluye este y los otros archivos necesarios antes de que:

test.cpp:

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

// more code here.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top