繁体   English   中英

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

班级成员从不拥有内部联系。 标准说(第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节):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM