何时应考虑使用定义在文件作用域的静态函数?
通常我会在需要一个任务不属于任何类的成员函数,且该任务只在某个源文件中需要(重复)执行时使用它们。
我的使用方式符合此特性存在的原因吗?还是我正在劫持一个本来用于其他用途的概念?
何时应考虑使用定义在文件作用域的静态函数?
通常我会在需要一个任务不属于任何类的成员函数,且该任务只在某个源文件中需要(重复)执行时使用它们。
我的使用方式符合此特性存在的原因吗?还是我正在劫持一个本来用于其他用途的概念?
这是文件作用域静态函数的一个完全有效的用法,但请记住,这种使用静态的方法已经被弃用了相当长一段时间。通常更喜欢使用匿名命名空间。
static
或者无名命名空间只是实现内部链接的机制。#ifndef H_MY_LIB
#define H_MY_LIB
namespace foo
{
void do_an_awesome_thing(void * p, std::size_t n);
}
#endif
my_lib.cpp:
#include "my_lib.hpp"
namespace foo
{
namespace
{
void helper(void * p) { /* ... */ }
bool aux(std::size_t n, float f) { /* ... */ }
constexpr char usage[] = R"(This is how you do it...)";
constexpr float some_factor = 1.25;
}
void do_an_awesome_thing(void *p, std::size_t n)
{
if (!aux(n, some_factor)) { LOG_AND_DIE(usage); }
helper(p);
}
}
当需要函数和/或数据不是类接口的一部分,而是实现细节时,我会做类似的事情。
但我不使用关键字static。相反,我将函数和/或数据放在一个未命名的命名空间中。