gpt4 book ai didi

c++ - 在带有 C++ header 的 Objective-C 中使用 include guard 重复警告

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:15 25 4
gpt4 key购买 nike

我在演示项目中有一个 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

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

最佳答案

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++ - 在带有 C++ header 的 Objective-C 中使用 include guard 重复警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11437151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com