gpt4 book ai didi

C++ 包含 Guard 奇怪的行为?

转载 作者:太空狗 更新时间:2023-10-29 20:33:31 27 4
gpt4 key购买 nike

我正在使用 Ubuntu 开发我的 SDL 游戏项目。
我创建了一个 header (声明)及其 cpp 文件(定义)。
有件事开始困扰我,请说明一下。

什么有用,我有什么:

(所有3个文件都在同一个文件夹下)

运动.h:

#include <SDL2/SDL.h>
class Movement{ ...... };`

运动.cpp:

    #include <SDL2/SDL.h>
#include "movement.h"
// Every Definition

主要.cpp:

    #include <SDL2/SDL.h>
#include "movement.h"
...... // contents

编译:

$ g++ main.cpp movement.cpp movement.h -lSDL2 -lSDL2_image

什么不起作用(包含保护):

(我只改了movement.cpp,其他不变)

运动.cpp:

#include <SDL2/SDL.h>
#ifndef MOVEMENT_H
#define MOVEMENT_H
...... // contents
#endif

错误:编译器提示它无法从 movement.h 中识别任何内容
例如:

......
movement.cpp: At global scope:
movement.cpp:73:6: error: ‘Movement’ has not been declared
......

我的问题:

1) 为什么我的 include guard(在 movement.cpp 中)不起作用?
我认为它会包括“movement.h”(当还没有时)。

*对 <SDL2/SDL.h> 使用 include guard|也不起作用(编译器给出“未声明”错误)。代码如下所示:

#ifndef SDL2_SDL_H
#define SDL2_SDL_H
......
#endif

2) 为什么 <SDL2/SDL.h>不需要包含守卫?
显然 movement.h 中包含一个另一个在 main.cpp . 不应该有一个双重包含错误吗?

最佳答案

movement.h:

#include <SDL2/SDL.h>
class Movement{ ...... };

标题可以包含在多个文件中。您应该使用 header 防护,此 header 中似乎缺少它。


1) Why my include guard ( in movement.cpp ) doesn't work ?

movement.cpp:

#include <SDL2/SDL.h>
#ifndef MOVEMENT_H
#define MOVEMENT_H

源文件不应该被包含到其他文件中,因此您不需要include保护。


Compile:

$ g++ main.cpp movement.cpp movement.h -lSDL2 -lSDL2_image
^^^^^^^^^^

头文件不需要编译。


2) Why <SDL2/SDL.h> doesn't need an include guard ?

SDL2/SDL.h确实有一个包含守卫:

#ifndef SDL_h_
#define SDL_h_

Apparently there's one included in movement.h and another in main.cpp. Shouldn't there be a double inclusion error ?

没有。标题保护删除了后者的包含。这就是头球后卫的作用。

附言仅当 header 具有定义时才需要 header 保护。只有声明的 header 不需要保护。然而,简单地在所有 header 中使用 header 保护比试图找出哪些 header 不需要它们要容易得多。

关于C++ 包含 Guard 奇怪的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54514611/

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