2012-07-11 43 views
2

我在一个示范项目文件iforce2d_topdown_car.h与包括防护件,像这样:具有重复的警告包括在Objective-C后卫C++头

#ifndef IFORCE2D_TOPDOWN_CAR_H 
#define IFORCE2D_TOPDOWN_CAR_H 

... source code ... 

#endif 

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

Header funkiness in xcode

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

回答

2

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并不聪明。

+0

嗨尼古拉斯,谢谢你的回答。你已经澄清了一下发生了什么,但是我仍然对包含后卫如何避免编译多次的代码感到困惑。不应该只运行一次#define,然后接下来的两次它不应该被编译? – 2012-07-11 18:08:29

+0

包含的守护程序在同一个翻译单元**中只保留一次**以上的代码。如果几个源文件包含相同的头文件,他们都需要获取它的内容。 – 2012-07-11 18:12:17

+0

啊哈!感谢那!看起来这是不寻常的,因为原始编码器在标题内使用了代码。我会尽量不要用我自己的代码来做到这一点。 – 2012-07-11 18:24:27