Fazendo referências a classes você havn't # include'd (C ++)
-
22-08-2019 - |
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
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.