我在演示项目中有一个文件 iforce2d_topdown_car.h ,其中包含如下保护:
#ifndef IFORCE2D_TOPDOWN_CAR_H
#define IFORCE2D_TOPDOWN_CAR_H
... source code ...
#endif
它包含在 HelloWorldLayer.h 中,然后包含在另外两个文件中(除了 iforce2d header 之外,这都是 obj-c)。一切都编译得很好,但我收到的任何错误都会显示 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 并不那么聪明。
关于c++ - Objective-C 中带有 C++ header 的包含防护的重复警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11437151/