Pergunta

Eu estou brincando com Box2D para se divertir agora, e depois de obter o jeito de alguns dos conceitos que eu decidi fazer o meu próprio teste para a cama de teste (Box2D vem com um conjunto de exemplos e tem um teste extensível simples classe para fazer seus próprios testes). Comecei por agarrando um dos outros testes, arrancando tudo, mas as assinaturas de função, e inserindo um pouco do meu próprio código.

No entanto, não há #includes para qualquer das bibliotecas de Box2D para que ele não compilar (mas só os meus erros de arquivos, remover o meu arquivo de teste e ele compila bem). Achei que deve ter apagado acidentalmente eles, quando eu estava em movimento coisas ao redor, mas no check outros arquivos de teste não há nenhuma #includes em qualquer lugar para ser visto. Cada um dos arquivos usa datastructures e funções que são declaradas em vários arquivos de cabeçalho Box2D. Como é que esta compilação de todo?

Por exemplo, este é um dos testes pré-embalados despojado do corpo do construtor e alguns comentários no topo:

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

Solução

Cada arquivo cpp é compilado. Antes ele é compilado no entanto, o pré-processador é executado. As ofertas preprocesser com todas as palavras-chave começando com #, como # include. O pré-processador tem o texto de quaisquer arquivos # include'd e substitui a instrução #include com todo o texto no arquivo inclui. Se o arquivo # include'd inclui outros arquivos, seu texto é buscado também.

Depois do pré-processador foi executado, você acaba com uma grande grande arquivo de texto chamado uma unidade de tradução. Isto é o que é compilado.

Então .. provavelmente como outras pessoas disseram. A algum lugar cpp inclui o material Box2D antes que inclui chain.h, então tudo funciona. Muitas vezes existe uma opção no compilador ou as configurações do projeto que irá receber o pré-processador para criar um arquivo com todo o texto na unidade de tradução para que você possa vê-lo. Isso às vezes é útil para rastrear erros com #includes ou macros.

Outras dicas

Talvez o cabeçalho que faz definir b2BodyDef é #included no CPP antes de este cabeçalho? Existem, obviamente, outros cabeçalhos envolvidos, ou você não seria capaz de se referir a aula Test.

O #ifndef CHAIN_H no início é um padrão comum que indica-me que esta é a partir de um arquivo chamado chain.h.

Os arquivos de cabeçalho como o chain.h você está citando não se destinam a ser stand-alone compilable. O mais provável é que você precisa para criar um simples C ++ - arquivo que inclui este e os necessários outros arquivos antes de:

test.cpp:

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

// more code here.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top