C ++是否包含Guard Weird行为?

时间:2019-02-04 10:53:59

标签: c++ sdl

我正在使用 Ubuntu 进行我的 SDL 游戏项目。
我创建了一个标头(声明)及其cpp文件(定义)。
事情开始困扰我,请阐明一下。

什么有效,我有什么:

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

movement.h:

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

movement.cpp:

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

main.cpp:

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

编译:

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

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

(我只更改了motion.cpp,其余的保持不变)

movement.cpp:

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

错误:编译器抱怨它无法识别运动中的任何内容。h
例如:

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

我的问题:

1)为什么我的包含卫队(在movement.cpp中)不起作用?
    我以为它会包含“ movement.h”(如果还没有的话)。

*使用<SDL2/SDL.h>的包含保护也不起作用(编译器给出“未声明”错误)。代码如下:

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

2)为什么<SDL2/SDL.h>不需要包含保护?
    显然,movement.h中包含一个,main.cpp中包含另一个。      应该不会出现双重包含错误?

1 个答案:

答案 0 :(得分:5)

  

movement.h:

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

标头可能包含在多个文件中。您应该使用标头保护,该标头似乎缺少该保护。


  

1)为什么我的include后卫(在Movement.cpp中)不起作用?

     

movement.cpp:

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

绝不要将 include 包含在源文件中,因此您不需要 include 保护。


  

编译:

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

头文件不需要编译。


  

2)为什么<SDL2/SDL.h>不需要包含保护?

SDL2/SDL.h确实具有包含保护:

#ifndef SDL_h_
#define SDL_h_

  

显然,motion.h中包含一个,main.cpp中包含另一个。应该不会出现双重包含错误?

不。标头防护删除了后者。那就是标题保护的作用。

P.S。仅当标头具有定义时才需要标头保护。仅具有声明的标头不需要保护。但是,简单地在所有标头中使用标头保护比尝试找出不需要它们的标头要容易得多。