C++包含后卫似乎不起作用?

use*_*501 3 c++ header file include guard

我以前曾多次使用过包括警卫,但从未真正理解他们的工作方式或原因.

以下为什么不工作?

#ifndef CAMERA_CLASS_HPP
#define CAMERA_CLASS_HPP


class camera_class
{
....
};

camera_class glcam = camera_class();


#endif // CAMERA_CLASS_HPP
Run Code Online (Sandbox Code Playgroud)

错误是这样的:(你可以从这个问题的标题中猜出它会是什么!)

-------------- Build: Debug in System ---------------

Linking console executable: bin/Debug/System
/usr/bin/ld: error: obj/Debug/main.o: multiple definition of 'glcam'
/usr/bin/ld: obj/Debug/camera_class.o: previous definition here
/usr/bin/ld: error: obj/Debug/main.glfunc.o: multiple definition of 'glcam'
/usr/bin/ld: obj/Debug/camera_class.o: previous definition here
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings
Run Code Online (Sandbox Code Playgroud)

另外,有人可以向我解释为什么头部防守工作吗?

hmj*_*mjd 8

标题防护将防止单个翻译单元中的多个包含.标题可以(并且是)包含在多个翻译单元中:

// a.cpp:
#include "camera.hpp"

// b.cpp
#include "camera.hpp"
Run Code Online (Sandbox Code Playgroud)

这将生成a a.obj和a b.obj,每个包含一个定义glcam.当链接在一起产生最终二进制时,您会得到多重定义错误.

您需要在标头中声明 glcam并在文件中准确定义一次.cpp:

// camera.hpp
...

extern camera_class glcam;

// camera.cpp
#include "camera.hpp"

camera_class glcam;
Run Code Online (Sandbox Code Playgroud)