c++ - Objective-C 中带有 C++ header 的包含防护的重复警告

标签 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 header 之外,这都是 obj-c)。一切都编译得很好,但我收到的任何错误都会显示 3 次。这让我很恼火,我想知道这是否是一个更大问题的症状。

Header funkiness in xcode

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

最佳答案

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/

相关文章:

c++ - cmake生成汇编文件然后编译成可执行文件

iOS 7 剪切、复制、全选 - 文本选项颜色

ios - 无法在自定义 UIView 上单击 UIButton

objective-c - DSBezelActivityView 上的内存泄漏

ios - 设备 'iPad Pro (12.9-inch) (2nd generation)' 不在可用模拟器列表中

c++ - 复制两个字符数组的模板函数

c++ - C++函数的多重声明

ios - response.products计数始终返回0 Xcode 4 ios应用程序内购买

ios - Storyboard中动态大小的 UITextView

c++ - 综合 gnu make/gcc 教程