Rob*_*Rob 20 c++ header c-preprocessor
我知道这对项目没有什么影响,但是,假设您使用#defined标头保护C++代码,您使用什么格式?例如假设一个标题foo.hpp
:
#ifndef __FOO_HPP__
...
#ifndef INCLUDED_FOO_HPP
...
#ifndef SOME_OTHER_FORMAT
Run Code Online (Sandbox Code Playgroud)
我卖的是关于大写#defines的想法,但不能解决这些守卫的格式.
Fio*_*onn 20
我总是在include guard中包含命名空间或相对路径,因为只有头名称才被证明是危险的.
例如,您有一些大型项目,其中包含代码中的两个文件
/myproject/module1/misc.h
/myproject/module2/misc.h
Run Code Online (Sandbox Code Playgroud)
因此,如果您为包含保护使用一致的命名方案,则可能最终会_MISC_HPP__
在两个文件中定义(非常有趣,以找到此类错误).
所以我安顿下来
MYPROJECT_MODULE1_MISC_H_
MYPROJECT_MODULE2_MISC_H_
Run Code Online (Sandbox Code Playgroud)
这些名称相当长,但与双重定义的痛苦相比,这是值得的.
另一种选择,如果你不需要编译器/平台独立性,你可能会寻找一些#pragma once stuff.
Mar*_*ote 13
为了真正避免名称冲突,我使用GUID:
#ifndef GUARD_8D419A5B_4AC2_4C34_B16E_2E5199F262ED
Run Code Online (Sandbox Code Playgroud)
Joh*_*itb 10
就个人而言,我只使用文件名FOO_HPP.Google使用整个路径,如SRC_ENGINE_FAST_HPP.
某些名称和函数签名集始终保留给实现:
- 每个包含双下划线(_ _)或以下划线后跟大写字母(2.11)开头的名称都保留给实现以供任何使用.
- 以下划线开头的每个名称都保留给实现,以用作全局名称空间中的名称.
(17.4.3.1.2/1
)
我更喜欢这种格式:
#ifndef FOO_HPP
#define FOO_HPP
/* ... */
#endif // FOO_HPP
Run Code Online (Sandbox Code Playgroud)
MYLIB_FOO_HPP
,它有助于避免命名冲突。