gpt4 book ai didi

c++ - 使用 C++ 头文件的最佳实践

转载 作者:IT老高 更新时间:2023-10-28 21:51:01 30 4
gpt4 key购买 nike

我对头文件的使用有以下疑惑。

1 - 包括在评论后放置的 guard

/* Copyright Note and licence information (multiple lines) */
#ifndef FOO_H
#define FOO_H
// Header file contents
#endif

Herb Sutter 在他的“C++ 编码标准”一书中说,像上面这样的代码是有问题的。他说“#ifndef”语句应该出现在头文件的第一行。我觉得这没有说服力。这是你们/gals在头文件中跟随的吗?

2 - 在头文件中使用命名空间

#ifndef FOO_H
#define FOO_H
namespace FooNameSpace{
// Header file contents
}
#endif

上面的代码是否使用正确的做法?我的意思是,你在头文件中使用命名空间吗?我知道为什么在头文件中导入命名空间是没有意义的,但是像上面这样的声明呢?

如果上面的方法是正确的,你如何对另一个命名空间中的类进行“前向声明”?是这样的吗

#ifndef FOO_H
#define FOO_H
namespace AnotherNameSpace{
class AnotherFoo; // forward declaration
}

namespace FooNameSpace{
// Use AnotherFoo here
}
#endif

前向声明”是避免“循环依赖”的唯一方法,对吗?

最佳答案

  1. 包含保护和注释的顺序纯粹是风格问题 - 它不会对编译速度产生任何可衡量的影响。

  2. 绝对应该在头文件中使用命名空间来声明函数、类、全局变量等。你应该做的是在头文件中使用using语句- 不可能在包含它的源文件中取消使用某些东西,并且您不应该强制包含器向全局范围添加额外的东西。如果您需要在 header 中使用来自其他命名空间的内容,请完全限定每个名称。有时可能会很痛苦,但这确实是正确的做法。

例子:

// WRONG!
using namespace std;
class MyClass
{
string stringVar;
};

// RIGHT
class MyClass
{
std::string stringVar;
};

至于其他命名空间中的类的前向声明,您完全正确。请记住,当您在标题中引用它时,始终将 AnotherFoo 限定为 AnotherNameSpace::AnotherFoo。事实上,前向声明是打破循环依赖的唯一方法。

关于c++ - 使用 C++ 头文件的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/410516/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com