通常如何命名包含守卫?我经常看到这样的情况:
#ifndef FOO_H #define FOO_H // ... #endif
然而,我不认为这是非常直观的。如果看不到文件名,就很难分辨FOO_H是用来做什么的,以及它的名字指的是什么。什么是最佳实践?
FOO_H
vzgqcmou1#
我个人遵循Boost的建议。它可能是最大的高质量C++库集合之一,它们没有问题。它是这样的:
<project>_<path_part1>_..._<path_partN>_<file>_<extension>_INCLUDED // include/pet/project/file.hpp #ifndef PET_PROJECT_FILE_HPP_INCLUDED
即:
_[A-Z]
__
INCLUDED
我读过关于 bat 侠的书,但那些看起来很奇怪。显然,我宁愿所有编译器都实现#pragma once(或者更好,#pragma multiple和“一次”是默认行为...)
#pragma once
#pragma multiple
von4xj4u2#
根据我自己的经验,惯例是在包含它们的头文件之后命名包含保护,例外的是名称都是大写的,并且用下划线替换句点。所以test.h变成了TEST_H。真实的例子包括Qt Creator,它在自动生成类头文件时遵循这个约定。
test.h
TEST_H
68de4m5k3#
直接摘自谷歌的风格指南:所有的头文件都应该有#define保护,以防止多重包含。符号名称的格式应该是_H_。为了保证唯一性,它们应该基于项目源代码树中的完整路径。例如,project foo中的foo/src/bar/baz.h文件应该有以下保护:
#ifndef FOO_BAR_BAZ_H_ #define FOO_BAR_BAZ_H_ ... #endif // FOO_BAR_BAZ_H_
我在自己的项目中使用这种风格。
hxzsmxv24#
看看#include是你的头的代码。如果它是这样的:
#include "mylib/myheader.h"
mylib/myheader.h已经是唯一的名称。只需大写并替换/ and。与_
mylib/myheader.h
#define MYLIB_MYHEADER_H
如果在包含路径上有两个标题,它们相对于包含路径具有相同的名称,则在该级别上已经存在冲突。
zd287kbt5#
将FOO_H替换为FOO_H_INCLUDED,更清晰。
FOO_H_INCLUDED
mv1qrgav6#
我通常会看看现在是什么时间,然后把它附加到它的末尾,即。FOO_H_248,这是一个额外的预防措施,你永远不会记住它,所以你不需要担心它是神秘的。
FOO_H_248
xienkqul7#
正如前面提到的,一个非常常见的约定是使用名称的小写版本,并将点替换为下划线:foo. h-> FOO_H但是,这可能会导致与简单和/或常见名称的名称冲突。出于这个原因,在非空的Visual C C++项目中自动生成的标头(如stdafx. h)会附加一些随机字符串,如:
#ifndef FOO_H__NsknZfLkajnTFBpHIhKS #define FOO_H__NsknZfLkajnTFBpHIhKS #endif
http://www.random.org/strings/是一个有用的随机生成器。此外,如果文件是某个子模块的一部分,或者它的内容位于一个特定的名称空间中,我倾向于将其添加到guard中:
#ifndef SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS #define SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS namespace somecomponent { ... } #endif
7d7tgy0s8#
我通常使用FOO_H_INCLUDED_。一些(Microsoft)头文件看起来很像是一个字符串表示,但我从来不需要任何如此复杂的东西。
FOO_H_INCLUDED_
bqjvbblv9#
通常人们通过文件名来执行,这样每个文件的代码只被编译和添加一次。您可以随意使用FOO_H,但我所编写或看到的几乎所有代码都使用该文件名。只要确保它是唯一的,因为您不希望您的FOO_H与其他人的FOO_H冲突。
9条答案
按热度按时间vzgqcmou1#
我个人遵循Boost的建议。它可能是最大的高质量C++库集合之一,它们没有问题。
它是这样的:
即:
_[A-Z]
开头或包含__
不是)INCLUDED
结束另一个宏,你会被战斗宠坏)我读过关于 bat 侠的书,但那些看起来很奇怪。
显然,我宁愿所有编译器都实现
#pragma once
(或者更好,#pragma multiple
和“一次”是默认行为...)von4xj4u2#
根据我自己的经验,惯例是在包含它们的头文件之后命名包含保护,例外的是名称都是大写的,并且用下划线替换句点。
所以
test.h
变成了TEST_H
。真实的例子包括Qt Creator,它在自动生成类头文件时遵循这个约定。
68de4m5k3#
直接摘自谷歌的风格指南:
所有的头文件都应该有#define保护,以防止多重包含。符号名称的格式应该是_H_。为了保证唯一性,它们应该基于项目源代码树中的完整路径。例如,project foo中的foo/src/bar/baz.h文件应该有以下保护:
我在自己的项目中使用这种风格。
hxzsmxv24#
看看#include是你的头的代码。
如果它是这样的:
mylib/myheader.h
已经是唯一的名称。只需大写并替换/ and。与_如果在包含路径上有两个标题,它们相对于包含路径具有相同的名称,则在该级别上已经存在冲突。
zd287kbt5#
将
FOO_H
替换为FOO_H_INCLUDED
,更清晰。mv1qrgav6#
我通常会看看现在是什么时间,然后把它附加到它的末尾,即。
FOO_H_248
,这是一个额外的预防措施,你永远不会记住它,所以你不需要担心它是神秘的。xienkqul7#
正如前面提到的,一个非常常见的约定是使用名称的小写版本,并将点替换为下划线:foo. h-> FOO_H
但是,这可能会导致与简单和/或常见名称的名称冲突。出于这个原因,在非空的Visual C C++项目中自动生成的标头(如stdafx. h)会附加一些随机字符串,如:
http://www.random.org/strings/是一个有用的随机生成器。
此外,如果文件是某个子模块的一部分,或者它的内容位于一个特定的名称空间中,我倾向于将其添加到guard中:
7d7tgy0s8#
我通常使用
FOO_H_INCLUDED_
。一些(Microsoft)头文件看起来很像是一个字符串表示,但我从来不需要任何如此复杂的东西。bqjvbblv9#
通常人们通过文件名来执行,这样每个文件的代码只被编译和添加一次。您可以随意使用FOO_H,但我所编写或看到的几乎所有代码都使用该文件名。只要确保它是唯一的,因为您不希望您的FOO_H与其他人的FOO_H冲突。