当我在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。
答案 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节)中的此规则:
首先在朋友声明中声明的函数具有外部链接。否则,该函数将保留其先前的链接。