C++ 带有C+的目标-C中包含防护装置的重复警告+;标题

C++ 带有C+的目标-C中包含防护装置的重复警告+;标题,c++,objective-c,xcode,objective-c++,C++,Objective C,Xcode,Objective C++,我在一个演示项目中有一个文件iforce2d_toppown_car.h,其中包含一个如下所示的include-guard: #ifndef IFORCE2D_TOPDOWN_CAR_H #define IFORCE2D_TOPDOWN_CAR_H ... source code ... #endif 这包含在HelloWorldLayer.h中,然后包含在另外两个文件中(除了iforce2d头之外,这都是obj-c)。一切都编译得很好,但我得到的任何错误都会显示3次。这让我很恼火,我想知

我在一个演示项目中有一个文件iforce2d_toppown_car.h,其中包含一个如下所示的include-guard:

#ifndef IFORCE2D_TOPDOWN_CAR_H
#define IFORCE2D_TOPDOWN_CAR_H

... source code ...

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

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

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

让我们假设您有以下
A.h

class A { public: int f(int i); }; class A { public: int 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); }; class A { public: int f(int i) { int j = i; return i + 1; } }; 甲级{ 公众: int f(int i){ int j=i; 返回i+1; } }; 然后,编译器将代码从函数定义直接复制到调用函数的源代码文件中。如果在3个不同的文件中使用该函数,则该函数将编译三次,并发出三次警告

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


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

嗨,尼古拉斯,谢谢你的回答。您已经澄清了一些情况,但我仍然不明白include守卫是如何防止代码被编译多次的。#define不应该只运行一次,然后再编译两次吗?include保护只会防止代码在同一翻译单元中被多次包含。如果多个源文件包含相同的头文件,它们都需要get来获取其内容。啊哈!谢谢你!这似乎是不寻常的,因为原始编码器在头中使用代码。我会尽量不使用我自己的代码。