C静态关键字与C++私有作用域
C static keyword vs C++ private scope?
C中翻译单元本地static
函数的C++等价物是什么
例如,在bar.c
中具有以下内容:
static void bar() {
// ...
}
在C++中,这会被写成像一样的私有成员函数吗
class foo {
void bar();
};
void foo::bar() {
// ...
}
私有成员函数隐式地引入了this
指针作为参数,因此它实际上无法与C风格的static
函数相比。但是,即使是private static
成员函数bar()
也会出现在公共接口中(并且链接器可以访问),这也是不可比较的。
虽然这些函数的可访问范围似乎相似,但这些选项看起来并不是上述C风格static
函数语法的好替代品。
等效的是一个未命名名称空间中的函数吗?该名称空间仅对当前翻译单元可见?
namespace {
void bar() {
// ...
}
}
[C]具有文件作用域的静态函数
static void bar() { ... }
这将创建一个名为bar
的函数,该函数具有内部链接。
[C++]具有文件作用域的静态函数
static void bar() { ... }
这将创建一个名为bar
的函数,该函数具有内部链接。
[C++]未命名的命名空间
namespace {
void bar() { ... }
}
这将创建一个名为bar
的函数,该函数具有内部链接。
结论
它们都是相同的。我可能建议在C++中使用未命名的名称空间,因为它消除了static
关键字的一些重载。但从代码的作用来看,这并不重要。
边栏:内部链接是什么意思
在C和C++中,我们有三种链接:外部、内部和无链接。为了定义这些,我将引用C++2011第3.5节第2段:
当一个名称可能表示与另一个范围中的声明引入的名称相同的对象、引用、函数、类型、模板、命名空间或值时,称其具有链接:
- 当一个名称具有外部链接时,它所表示的实体可以由其他翻译单元的作用域或同一翻译单元的其他作用域的名称引用
- 当一个名称具有内部链接时,它所表示的实体可以由同一翻译单元中其他作用域的名称引用
- 当一个名称没有链接时,它所表示的实体不能由其他作用域的名称引用
C 2011在第6.2.2节第2段:中有类似的语言
在构成整个程序的一组翻译单元和库中,具有外部链接的特定标识符的每个声明都表示相同的对象或函数。在一个翻译单元中,具有内部链接的标识符的每个声明表示相同的对象或函数。没有链接的标识符的每个声明都表示一个唯一的实体。
因此,具有内部链接的名称只在它们所在的翻译单元中可见。
边栏:让我们包括一个内部链接在实践中如何工作的示例:
让我们创建2个c++文件bar.cc将只包含一个具有内部链接的函数:
static void bar() {}
我们还将创建main.cc,它将尝试使用该bar()
。
extern void bar();
int main() {
bar();
}
如果我们编译这个,我们的链接器就会抱怨。从main.cc翻译单元中找不到名为CCD_ 13的函数。这是内部链接的预期行为。
Undefined symbols for architecture x86_64:
"bar()", referenced from:
_main in main-c16bef.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- 在构造函数中输入对象时C++类成员作用域
- 无法让"std::enable_if"适用于无作用域枚举
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 如何在C++中访问作用域的变量输出?
- 重载时未在 C++ 的作用域错误中声明
- 作用域枚举和标准::get