在带有C ++标头的Objective-C中使用include guard进行重复警告

时间:2012-07-11 16:26:54

标签: c++ objective-c xcode objective-c++

我在一个示例项目中有一个文件iforce2d_topdown_car.h,其中包含一个包含这样的内容:

#ifndef IFORCE2D_TOPDOWN_CAR_H
#define IFORCE2D_TOPDOWN_CAR_H

... source code ...

#endif

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

Header funkiness in xcode

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

1 个答案:

答案 0 :(得分:3)

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

假设您有以下A.h

class A {
public:
    int f(int i);
};

A.cpp

int A::f(int i) {
    int j = i;
    return i + 1;
}

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

但如果您写下以下A.h

class A {
public:
    int f(int i) {
        int j = i;
        return i + 1;
    }
};

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

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

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