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)
另外,有人可以向我解释为什么头部防守工作吗?
标题防护将防止单个翻译单元中的多个包含.标题可以(并且是)包含在多个翻译单元中:
// 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)
| 归档时间: |
|
| 查看次数: |
1046 次 |
| 最近记录: |