C++ C+的内部链接+;私人职能?

C++ C+的内部链接+;私人职能?,c++,private,C++,Private,当我用C编写面向对象的代码时,我通常将结构定义和公共函数放在一个头文件中,并在一个单独的.C文件中实现公共函数。我将static关键字指定给这个类的所有“private”函数,并在.c文件中实现它们。然后,公共函数可以调用属于同一类的私有函数。由于static关键字,私有函数不能从外部调用,因此GCC可以优化其中许多函数。它们通常是内联的,原始函数从输出对象文件中完全删除 现在我的问题是:我如何能与C++类做同样的事情?< /P> 假设我有一个头文件: A类{ int私有_字段; int pri

当我用C编写面向对象的代码时,我通常将结构定义和公共函数放在一个头文件中,并在一个单独的.C文件中实现公共函数。我将static关键字指定给这个类的所有“private”函数,并在.c文件中实现它们。然后,公共函数可以调用属于同一类的私有函数。由于static关键字,私有函数不能从外部调用,因此GCC可以优化其中许多函数。它们通常是内联的,原始函数从输出对象文件中完全删除

现在我的问题是:我如何能与C++类做同样的事情?< /P> 假设我有一个头文件:

A类{
int私有_字段;
int private_函数();
公众:
int public_函数();
};
和我的.cpp文件:

#包括
#包括“A.h”
int A::private_函数(){
std::cin>>专用_字段;
返回私有_字段;
}
int A::public_函数(){
返回private_函数()+4;
}
在生成的对象文件中,private_函数作为单独的符号保留,public_函数调用private_函数(非内联)。 我想给出private_函数的内部链接,这样编译器就可以像使用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;
}
#包括
#包括“A.h”
静态int private_函数(A*pThis)
{
std::cin>>pThis->private_字段;
返回私有_字段;
}
int A::public_函数(){
返回private_函数(this)+4;
}
请注意标准中的这一规则(第11.3节):

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


“我尝试过匿名名称空间和静态,但我无法让它按我所希望的方式工作。”出了什么问题?我已经回答了你的问题,但编译器应该能够执行大多数优化,例如内联,而不需要内部链接。内联有时会完成(对于小函数),但是原始版本总是保留=>更大的库大小。您是否尝试过LTO(链接时间优化)-需要gcc的现代版本-4.7以后可能是最佳选择。是的,我尝试过。它并不完美,但总比没有好:)我觉得标准很奇怪。在没有朋友的情况下,你为什么希望外部链接到私人功能?@Emil:因为这样可以将公共成员内联到其他翻译单元中。考虑< <代码>::公报函数在类中声明为内联。它很短,因此编译器希望在所有调用站点,无论它们出现在什么翻译单元中,都将其内联。但是,
private_函数
需要在所有这些站点上都可以链接。从C++17开始,成员函数与封闭类具有相同的链接。参考中[class.mfct]第2段中的注释。这并没有真正改变这个问题的结论,但对于人们想要控制其成员函数的链接的其他用例来说,这可能很重要。