2

我在演示项目中有一个文件 iforce2d_topdown_car.h ,其中包含如下保护:

#ifndef IFORCE2D_TOPDOWN_CAR_H
#define IFORCE2D_TOPDOWN_CAR_H

... source code ...

#endif

这包含在 HelloWorldLayer.h 中,然后包含在另外两个文件中(除了 iforce2d 标头之外,这都是 obj-c)。一切编译正常,但我得到的任何错误都会显示 3 次。这让我很恼火,我想知道它是否是更大问题的征兆。

xcode中的标头时髦

这是预期的行为吗?在我看来,如果定义了预处理器 var,那么它将保持定义,并且下次包含它时将不会被编译。这里似乎不是这种情况,但我不知道为什么。

4

1 回答 1

3

是一个内联成员函数,TDCar(b2World *)因为它是在其类定义中定义的。这意味着编译器会实例化该函数并在每个调用该函数的翻译单元中发出相应的警告。

假设您有以下内容A.h

A类{
上市:
    int f(int i);
};

A.cpp

int A::f(int i) {
    诠释 j = 我;
    返回 i + 1;
}

编译器将编译该函数A::f(int i)一次并将其导出,因此对该函数的每次调用都将链接到导出的符号。因此,未使用变量的警告j将发出一次:A.cpp编译时。

但是,如果您编写以下内容A.h

A类{
上市:
    整数 f(int i) {
        诠释 j = 我;
        返回 i + 1;
    }
};

然后编译器会将函数定义中的代码直接复制到调用函数的源代码文件中。如果您在 3 个不同的文件中使用该函数,该函数将编译三次并发出三次警告。

由于每个文件都是单独编译的,因此编译器无法知道已经针对另一个文件发出了警告。

Xcode 应该足够聪明,能够将三个警告识别为相同的并将它们聚合起来,这样您就只会得到一个警告。不幸的是,Xcode 没有那么聪明。

于 2012-07-11T17:38:01.587 回答