1

我现在正在玩 Box2D 以获得乐趣,在掌握了一些概念之后,我决定为测试平台进行自己的测试(Box2D 带有一组示例,并且有一个简单的可扩展测试类用于制作你自己的测试)。我首先抓取了其他测试之一,删除了除函数签名之外的所有内容,并插入了一些我自己的代码。

但是,Box2D 的任何库都没有#includes,因此它不会编译(但只有我的文件错误,删除我的测试文件并且它编译得很好)。我想我一定是在移动东西时不小心删除了它们,但是在检查其他测试文件时,任何地方都看不到#includes。每个文件都使用在各种 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
4

3 回答 3

2

也许定义 b2BodyDef 的标头在此标头之前的 .cpp 中#included ?显然还涉及其他标头,否则您将无法引用 Test 类。

于 2009-05-16T08:33:21.537 回答
1

开头是一个常见的#ifndef CHAIN_H模式,向我表明这是来自一个名为chain.h.

像您引用的头文件chain.h并不打算独立编译。您很可能需要创建一个简单的 C++ 文件,其中包括此文件和之前的必要其他文件:

测试.cpp:

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

// more code here.
于 2009-05-16T09:19:37.883 回答
1

每个 cpp 文件都会被编译。但是,在编译之前,预处理器会运行。预处理器处理所有以# 开头的关键字,例如#include。预处理器获取任何#include'd 文件的文本并将#include 语句替换为它包含的文件中的所有文本。如果#include'd 文件包含其他文件,它们的文本也会被获取。

预处理器运行后,您会得到一个称为翻译单元的大文本文件。这就是编译的内容。

所以..可能正如其他人所说。某处的 cpp 文件在包含 chain.h 之前包含 Box2D 的东西,所以一切正常。编译器或项目设置中通常有一个选项可以让预处理器创建一个包含翻译单元中所有文本的文件,以便您可以看到它。这有时对于使用#includes 或宏跟踪错误很有用。

于 2009-05-16T13:36:57.843 回答