c++私有函数的内部链接

Internal linkage for C++ private functions?

本文关键字:内部 链接 函数 c++      更新时间:2023-10-16

当我用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节)中的这条规则:

首先在友元声明中声明的函数具有外部链接。否则,该函数保留其先前的链接。