gpt4 book ai didi

C++ 命名空间函数

转载 作者:IT老高 更新时间:2023-10-28 12:43:09 25 4
gpt4 key购买 nike

我是一名 Java 开发人员,对 C++ 还很陌生。我需要实现某种实用程序类,并且我正在考虑将这些方法实现为静态的。然而,我遇到了this stackoverflow question关于命名空间函数与静态方法,显然命名空间函数是首选方法。所以我想知道是否有任何关于如何实现命名空间功能的文章或示例。例如,我应该如何在头文件中声明命名空间函数? header 应该只包含类头文件等函数定义,并且实现应该在 cpp 文件中,还是应该直接在头文件中实现函数?

基本上,我正在尝试实现一个应用程序来解析包含一些命令的文本文件。所以我正在考虑实现静态辅助方法来处理文本处理。例如 readCommand(字符串行)。如果我的方向错误,请告诉我。谢谢

最佳答案

how should I declare namespace functions in header file?

namespace MON {
// extern:
t_ret func(const t_param& pValue);
// 'inline':
inline t_ret inline_func(const t_param& pValue) { ... }
} // << MON

Should header only contain function definitions like class header file and implementations should be in cpp file, or should I straight away implement functions in header file?

这取决于您是希望它们(可能)内联还是导出。这通常归结为最小化依赖关系。

扩展导出或内联:

您通常倾向于使用 extern 函数来最小化 c++ 中的依赖关系。这相当于在类方法中将定义与声明分开:

文件.hpp

namespace MON {
// extern:
t_ret func(const t_param& pValue);
} // << MON

文件.cpp

#include "hefty_stuff.hpp"

MON::t_ret MON::func(const t_param& pValue) { ... }

但是,在某些情况下,定义可见有时很重要,通常是为了提高性能,或者当您知道大小很重要并且标题没有包含在很多地方时。因此,inline变体也是一种选择。

仍然可以导出内联函数,并且可以按要求内联 - 但是,可以合并任何内联函数拷贝(具体来说,实现可以自由假设所有定义都是相等的,并且函数的任何拷贝都是不必要的)。

使用导出的定义,您可以选择性地限制(或隔离)您的包含依赖项。即 #include "hefty_stuff.hpp"无需在标题中即可使用 file.hpp 中的功能.


Basically, I am trying to implement an application to parse a text file that contains some commands. So I am thinking of implementing static helper methods to handle text processing.

好吧,static这里应该避免。 c++ 使用单一定义规则。 static只会导致很多不必要的拷贝。此外,匿名命名空间是 c 的 static 的 c++ 方法。功能:

namespace {
t_ret func(const t_param& pValue) { ... }
} // << anon

注意:匿名命名空间也可能导致不必要的复制。您将它们用作静态函数的替代品的原因是,如果您想要或需要偏离单一定义规则,并且不想在可能被“解析”的范围内声明符号。


最后一点是 template<>声明。对于模板,定义必须在使用时可见,除非您的编译器支持外部模板。对于模板,您可以通过多种方式实现定义可见性。通常,人们会简单地在适当的位置声明定义,或者为定义添加一个标题,该标题包含在标题的末尾或根据需要。使用模板,函数不需要声明 inline避免多次定义错误。

关于C++ 命名空间函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10492847/

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