C ++私有函数的内部链接?

时间:2012-12-29 23:24:46

标签: c++ private

当我在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时相同的优化。 我尝试过使用匿名命名空间和静态命名空间,但我无法按照我的意愿使用它。 如何正确地做到这一点,甚至可能吗?我使用GCC。

1 个答案:

答案 0 :(得分:8)

班级成员永远不会有内部联系。标准说(第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节)中的此规则:

  

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