c++私有函数的内部链接
Internal linkage for C++ private functions?
当我用C编写面向对象的代码时,我通常将结构定义与公共函数放在头文件中,并在单独的. C文件中实现公共函数。我为该类的所有"私有"函数提供static关键字,并在.c文件中实现它们。然后,公共函数可以调用属于同一类的私有函数。由于static关键字,私有函数不能从外部调用,因此GCC可以优化这些函数中的许多函数。它们通常是内联的,原始函数完全从输出对象文件中删除。
现在我的问题是:我如何用c++类做同样的事情?
假设我有一个头文件:
class A {
int private_field;
int private_function();
public:
int public_function();
};
和我的。cpp文件:
#include <iostream>
#include "A.h"
int A::private_function() {
std::cin >> private_field;
return private_field;
}
int A::public_function() {
return private_function() + 4;
}
在结果对象文件中,private_function作为一个单独的符号保留,并且public_function调用private_function(未内联)。我想给private_function内部链接,所以编译器可以做相同的优化,当我使用C。我已经尝试过匿名命名空间和静态,但我不能让它像我想的那样工作。如何正确地做到这一点,这可能吗?
类成员没有内部链接。标准规定(第9.3节):
命名空间作用域中类的成员函数具有外部链接。局部类的成员函数没有链接。
因此,如果您想创建具有内部链接的辅助函数,则必须使用非成员。
static int private_function(A* pThis);
class A
{
int private_field;
friend int private_function(A* pThis);
public:
int public_function();
};
和
#include <iostream>
#include "A.h"
static int private_function(A* pThis)
{
std::cin >> pThis->private_field;
return private_field;
}
int A::public_function() {
return private_function(this) + 4;
}
请注意标准(第11.3节)中的这条规则:
首先在友元声明中声明的函数具有外部链接。否则,该函数保留其先前的链接。
相关文章:
- 内联函数中具有内部链接的全局变量
- C++:具有内部链接的正向声明常量
- 具有命名空间范围的名称的 C++ 内部链接
- 为什么函数 f4 的名称具有内部链接,而不是 C 语言链接?
- 为什么在匿名名称空间中定义的模板时,为什么内部链接错误
- C++构造函数具有内部链接,但未定义 [-Wundefined-internal]
- C 无需使用匿名名称空间即可实现内部链接
- 内联是否决定内部链接?
- ODR和内部链接
- 为什么内部链接的名称会出现在我的目标文件的符号表中?
- C 标准:DO命名空间constexpr变量具有内部链接
- 通过来自另一个翻译单元的指针调用具有内部链接的函数
- 如何使朋友函数具有内部链接
- 类使用全局外部常量变量,该变量通过内部链接定义
- char* 具有内部链接,因此它不能不是非类型模板参数
- C++中const的内部链接,但我得到了重复的符号
- 非成员函数模板何时具有内部链接
- 我是否应该始终将我的全局函数与内部链接
- 内联命名空间变量有内部链接吗?如果没有,为什么下面的代码有效
- 使用comsup.lib时出现内部链接器错误