[英]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.