C++包含警卫怪异行为?

pip*_*101 3 c++ sdl

我正在使用Ubuntu开发我的SDL游戏项目. 我创建了一个头(声明)及其cpp文件(定义). 有些事情开始让我烦恼,请说清楚.

什么工作和我有什么:

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

movement.h:

#include <SDL2/SDL.h>
class Movement{ ...... };`
Run Code Online (Sandbox Code Playgroud)

movement.cpp:

    #include <SDL2/SDL.h>
    #include "movement.h"
    // Every Definition
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

    #include <SDL2/SDL.h>
    #include "movement.h"
    ...... // contents
Run Code Online (Sandbox Code Playgroud)

编译:

$ g++ main.cpp movement.cpp movement.h -lSDL2 -lSDL2_image
Run Code Online (Sandbox Code Playgroud)

什么不起作用(包括警卫):

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

movement.cpp:

#include <SDL2/SDL.h>
#ifndef MOVEMENT_H
#define MOVEMENT_H
...... // contents
#endif
Run Code Online (Sandbox Code Playgroud)

错误:编译器抱怨它无法识别来自movement.h的任何内容
.例如:

......
movement.cpp: At global scope:
movement.cpp:73:6: error: ‘Movement’ has not been declared
......
Run Code Online (Sandbox Code Playgroud)

我的问题:

1)为什么我的包括守卫(in movement.cpp)不起作用?
我想它会包含"movement.h"(当时还没有).

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

#ifndef SDL2_SDL_H
#define SDL2_SDL_H
......
#endif
Run Code Online (Sandbox Code Playgroud)

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

eer*_*ika 5

movement.h:

#include <SDL2/SDL.h>
class Movement{ ...... };
Run Code Online (Sandbox Code Playgroud)

标题可以包含在多个文件中.你应该使用一个标题保护,这个标题似乎没有.


1)为什么我的包含守卫(在movement.cpp中)不起作用?

movement.cpp:

#include <SDL2/SDL.h>
#ifndef MOVEMENT_H
#define MOVEMENT_H
Run Code Online (Sandbox Code Playgroud)

源文件永远不应该包含在其他文件中,因此您不需要包含保护.


编译:

$ g++ main.cpp movement.cpp movement.h -lSDL2 -lSDL2_image
                            ^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

头文件不需要编译.


2)为什么<SDL2/SDL.h>不需要包括警卫?

SDL2/SDL.h确实有一个包含警戒:

#ifndef SDL_h_
#define SDL_h_
Run Code Online (Sandbox Code Playgroud)

显然有一个包含在movement.h中,另一个包含在main.cpp中.不应该有双重包含错误?

不会.头部防护装置会移除后者.这就是头球卫士的用武之地.

仅当标头具有定义时,才需要PS标头保护.只有声明的标题不需要保护.但是,在所有标头中简单地使用标头保护比尝试找出不需要哪个标头更容易.