Создание ссылок на классы, которые вы не # include'd (C ++) - PullRequest
1 голос
/ 16 мая 2009

Я сейчас играю с Box2D для развлечения, и после ознакомления с некоторыми из концепций я решил провести собственный тест для тестового стенда (Box2D поставляется с набором примеров и имеет простой расширяемый тест класс для создания собственных тестов). Я начал с того, что взял один из других тестов, вырвал все, кроме сигнатур функций, и вставил часть своего собственного кода.

Тем не менее, нет #include для какой-либо из библиотек Box2D, поэтому он не компилируется (только ошибки моего файла, удалите мой тестовый файл, и он прекрасно скомпилируется). Я подумал, что случайно удалил их, когда перемещал вещи, но после проверки других тестовых файлов нигде не было видно включений. Каждый из файлов использует структуры данных и функции, которые объявлены в различных заголовочных файлах Box2D. Как это компилируется вообще?

Например, это один из предварительно упакованных тестов без тела конструктора и несколько комментариев вверху:

#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

Ответы [ 3 ]

2 голосов
/ 16 мая 2009

#ifndef CHAIN_H в начале - это общий шаблон, который указывает мне, что это из файла с именем chain.h.

Заголовочные файлы, такие как chain.h, которые вы цитируете, не предназначены для автономной компиляции. Скорее всего, вам нужно создать простой C ++ - файл, который включает в себя этот и другие необходимые файлы перед ним:

test.cpp:

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

// more code here.
2 голосов
/ 16 мая 2009

Возможно, заголовок, который определяет b2BodyDef, #cpported в .cpp перед этим заголовком? Очевидно, задействованы другие заголовки, иначе вы не сможете сослаться на класс Test.

1 голос
/ 16 мая 2009

Каждый файл cpp компилируется. Прежде чем он скомпилирован, препроцессор запускается. Препроцессор обрабатывает все ключевые слова, начинающиеся с #, например #include. Препроцессор берет текст любых # include'd файлов и заменяет инструкцию #include на весь текст в файле, который он включает. Если файл # include'd содержит другие файлы, их текст также извлекается.

После запуска препроцессора у вас получается большой большой текстовый файл, называемый переводчиком. Это то, что компилируется.

Так что ... наверное, как говорили другие люди. Файл cpp где-то включает материал Box2D, прежде чем он включает chain.h, так что все работает. Часто в настройках компилятора или проекта есть опция, которая заставит препроцессор создать файл со всем текстом в модуле перевода, чтобы вы могли его увидеть. Это иногда полезно для отслеживания ошибок с помощью #include или макросов.

...