简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
本篇目的:C++之类和函数权限访问总结。
__attribute__((visibility("hidden")))
是GCC编译器提供的一个属性(Attribute),用于控制符号(symbols)在共享库(shared library)中的可见性。
可见性定义了一个符号(如函数、变量、类)是否可以被其他源文件或共享库访问。通过设置可见性属性,可以控制符号的可见性范围,从而提高代码的安全性和封装性。
visibility("hidden")
是__attribute__
宏的一个参数,指定了符号的隐藏可见性。当一个符号被标记为hidden
时,该符号对于其他目标文件或共享库是不可见的,无法访问。
__attribute__((visibility("hidden")))
通常用于隐藏不应暴露给外部的实现细节,以防止其他代码直接访问和修改这些内部实现。这有助于提高代码的安全性和可维护性,同时遵循封装原则。
下面是__attribute__((visibility("hidden")))
的一些常见使用场景:
隐藏内部实现:可以将某些类、函数、变量标记为__attribute__((visibility("hidden")))
,这样其他代码无法直接访问这些实现细节,只能通过公共接口进行交互。
防止符号冲突:当在共享库中存在多个同名符号时,通过设置不同的可见性属性,可以避免符号冲突和链接错误。
减少符号表大小:设置一些私有符号为隐藏可见性,可以减少符号表的大小,从而降低链接时间和可执行文件的大小。
保护敏感信息:可以使用隐藏可见性来隐藏包含敏感信息的符号,以增加代码的安全性。
需要注意的是,__attribute__((visibility("hidden")))
只对支持这一特性的编译器有效,且使用该特性可能会导致一些潜在问题,如符号无法被动态链接到其他代码,因此需要谨慎使用。
,__attribute__((visibility("hidden")))
可以通过设置符号的可见性,控制代码的封装性和安全性,使其更加模块化和可维护。然而,在使用时需要考虑到特定环境和编译器的兼容性以及潜在的问题。
#define C2_HIDE __attribute__((visibility("hidden")));
// 可以访问 ParamBuilder 的类
class OtherClass {
public:
void accessParamBuilder() {
ParamBuilder pb;
// perform operations on ParamBuilder...
}
};
class C2_HIDE ParamBuilder {
// ParamBuilder 类的成员定义...
};
int main() {
OtherClass oc;
oc.accessParamBuilder();
return 0;
}
#define C2_HIDE __attribute__((visibility("hidden")));
// 无法访问 ParamBuilder 的类
class AnotherClass {
public:
void tryAccessParamBuilder() {
ParamBuilder pb; // 编译错误:undeclared identifier 'ParamBuilder'
}
};
class C2_HIDE ParamBuilder {
// ParamBuilder 类的成员定义...
};
int main() {
AnotherClass ac;
ac.tryAccessParamBuilder();
return 0;
}
#define C2_HIDE __attribute__((visibility("hidden")));
class OtherClass {
public:
void accessParamBuilderFunction() {
ParamBuilder pb;
pb.internalFunction(); // 调用 ParamBuilder 的内部函数
}
};
class C2_HIDE ParamBuilder {
public:
void internalFunction() {
// 内部函数的定义...
}
};
int main() {
OtherClass oc;
oc.accessParamBuilderFunction();
return 0;
}
#define C2_HIDE __attribute__((visibility("hidden")));
class AnotherClass {
public:
void tryAccessParamBuilderFunction() {
ParamBuilder pb;
pb.internalFunction(); // 编译错误:'internalFunction' is a private member of 'ParamBuilder'
}
};
class C2_HIDE ParamBuilder {
private:
void internalFunction() {
// 内部函数的定义...
}
};
int main() {
AnotherClass ac;
ac.tryAccessParamBuilderFunction();
return 0;
}
class OtherClass {
public:
void accessParamBuilder() {
ParamBuilder pb;
// 调用和操作 ParamBuilder
}
};
class ParamBuilder {
public:
void publicFunction() {
// 公共函数的实现
}
};
int main() {
OtherClass oc;
oc.accessParamBuilder();
return 0;
}