11

当我用 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。

4

1 回答 1

14

类成员永远不会有内部联系。该标准说(第 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 节):

A function first declared in a friend declaration has external linkage. Otherwise, the function retains its previous linkage.

于 2012-12-29T23:28:42.643 回答