C++之类和函数权限访问总结(二百二十七)

news2025/1/13 11:59:16

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:C++之类和函数权限访问总结。

__attribute__((visibility("hidden")))是GCC编译器提供的一个属性(Attribute),用于控制符号(symbols)在共享库(shared library)中的可见性。

可见性定义了一个符号(如函数、变量、类)是否可以被其他源文件或共享库访问。通过设置可见性属性,可以控制符号的可见性范围,从而提高代码的安全性和封装性。

visibility("hidden")__attribute__宏的一个参数,指定了符号的隐藏可见性。当一个符号被标记为hidden时,该符号对于其他目标文件或共享库是不可见的,无法访问。

__attribute__((visibility("hidden")))通常用于隐藏不应暴露给外部的实现细节,以防止其他代码直接访问和修改这些内部实现。这有助于提高代码的安全性和可维护性,同时遵循封装原则。

下面是__attribute__((visibility("hidden")))的一些常见使用场景:

  1. 隐藏内部实现:可以将某些类、函数、变量标记为__attribute__((visibility("hidden"))),这样其他代码无法直接访问这些实现细节,只能通过公共接口进行交互。

  2. 防止符号冲突:当在共享库中存在多个同名符号时,通过设置不同的可见性属性,可以避免符号冲突和链接错误。

  3. 减少符号表大小:设置一些私有符号为隐藏可见性,可以减少符号表的大小,从而降低链接时间和可执行文件的大小。

  4. 保护敏感信息:可以使用隐藏可见性来隐藏包含敏感信息的符号,以增加代码的安全性。

需要注意的是,__attribute__((visibility("hidden")))只对支持这一特性的编译器有效,且使用该特性可能会导致一些潜在问题,如符号无法被动态链接到其他代码,因此需要谨慎使用。

__attribute__((visibility("hidden")))可以通过设置符号的可见性,控制代码的封装性和安全性,使其更加模块化和可维护。然而,在使用时需要考虑到特定环境和编译器的兼容性以及潜在的问题。

2.应用实例

v1.0. 其他类可以访问:

#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;
}

v2.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;
}

v3.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;
}

v4.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;
}

v5.0. 其他类完全可以访问

class OtherClass {
public:
    void accessParamBuilder() {
        ParamBuilder pb;
        // 调用和操作 ParamBuilder
    }
};

class ParamBuilder {
public:
    void publicFunction() {
        // 公共函数的实现
    }
};

int main() {
    OtherClass oc;
    oc.accessParamBuilder();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件的开发步骤,需求分析,开发环境搭建,接口文档 ---苍穹外卖1

目录 项目总览 开发准备 开发步骤 角色分工 软件环境 项目介绍 产品原型 技术选型 开发环境搭建 前端:默认已有 后端 使用Git版本控制 数据库环境搭建 前后端联调 ​登录功能完善 导入接口文档 使用swagger​ 和yapi的区别 常用注解 项目总览 开发准备 开发步骤…

用tkinter+selenium做一个CSDN热榜爬虫

文章目录 UI设计函数封装功能实现 自从学会了分析热榜,就是CSDN热榜分析,每天都要爬下来分析一下热榜都在干什么。但脚本运行到底还是不方便,所以接下来就想办法将其做成一个带有界面的热榜爬虫 UI设计 做一个热榜爬虫的交互式界面&#xf…

IOS版微信8.0.42正式版已推出:新增多语言“翻译”!

微信最近的更新的真的很快,包括Mac、iPhone、PC端以及安卓版本都进行了更新推送。 微信iOS 8.0.42正式版已经向公众开放,这个新版本在原有功能的基础上,对群管理界面、翻译功能、小程序等方面进行了优化和改进,让用户的使用体验更…

嵌入式Linux--进程间通信--共享内存

1. 回顾之前的通信内容: 进程间通信主要有5种通信方式 1、无名管道(只能单向发送或接收) 2、命名管道(同上) 3、消息队列(可以发送,也能接收消息) 4、共享内存(有一块公…

呼叫中心系统角色功能的应用

呼叫中心系统拥有强大的功能,根据角色不同能够使用的功能也是不同的,按规则是角色权限越大,可以使用的功能也越多。如普通坐席最重要的工作就是接打电话,没必要使用全部功能,只需有几个话务相关功能就足够了&#xff0…

phpstudy RCE脚本编写(Python)

文章目录 编写过程脚本优化 编写过程 关于phpstudy 2016-2018 RCE漏洞的验证,请移步我的这篇博客 phpstudy2016 RCE漏洞验证。 将之前漏洞验证的数据包复制下来,编写脚本时需要使用: GET /phpinfo.php HTTP/1.1 Host: 10.9.75.164 Upgrade…

无涯教程-JavaScript - SERIESSUM函数

描述 SERIESSUM函数返回幂级数的总和。幂级数展开可近似许多功能。 语法 SERIESSUM (x, n, m, coefficients)争论 Argument描述Required/OptionalXThe input value to the power series.RequiredNThe initial power to which you want to raise x.RequiredMThe step by whi…

找不到名称 “$“。是否需要安装 jQuery 的类型定义? 请尝试使用 `npm i --save-dev @types/jquery`。

vitevue3环境 1、安装jQuery npm install --save jquery 2、在main.ts文件进行配置 declare const window: any; import jQuery from jquery; window.$ window.jQuery jQuery; 注意:需要声明window属性; 要不然会报错:类型“Window &am…

八、数据类型转换

数据类型转换 1.数据类型转换1.1.隐式类型转换1.2.显式类型转换1.3.训练11.4.训练2 —————————————————————————————————————————————————— 1.数据类型转换 类型转换是将一个值从一种类型更改为另一种类型的过程。例如&…

Navicat 武林小秘籍 | 如何在数据同步期间查看源和目标之间的数据差异

可应用操作系统:Windows、macOS、Linux 可应用 Navicat 产品:Navicat for MySQL、Navicat for PostgreSQL、Navicat for Oracle、Navicat for SQL Server、Navicat for MariaDB、Navicat for SQLite、Navicat for MongoDB、Navicat Premium 可应用 Nav…

【记录】Python 之于 C/C++ 区别

记录本人在 Python 上经常写错的一些地方&#xff08;C/C 写多了&#xff0c;再写 Python 有点切换不过来&#xff09; 逻辑判断符号用 and、or、!可以直接 10 < num < 30 比较大小分支语句&#xff1a;if、elif、else使用 、-&#xff0c;Python 中不支持 、- - 这两个…

LVS 负载均衡集群的DR模式配置

集群 集群的概述 集群技术是一种用于提高系统性能、可用性、容错性和可扩展性的关键方法。它涉及将多个计算资源或节点组合在一起&#xff0c;以协同工作以处理任务、服务请求或数据处理。 集群类型 无论是哪种集群&#xff0c;都至少包括两台节点服务器&#xff0c;而对外…

AB实验总结

互联网有线上系统&#xff0c;可做严格的AB实验。传统行业很多是不能做AB实验的。 匹配侧是采用严格的AB实验来进行模型迭代&#xff0c;而精细化定价是不能通过AB实验来评估模型好坏&#xff0c;经历过合成控制法、双重差分法&#xff0c;目前采用双重差分法来进行效果评估。…

无涯教程-JavaScript - MROUND函数

描述 MROUND函数返回一个舍入为所需倍数的数字。 MROUND函数是Excel中的15个舍入函数之一。 语法 MROUND (number, multiple)争论 Argument描述Required/OptionalNumberThe value to round.RequiredMultipleThe multiple to which you want to round number.Required Note…

如何使用chorme版本对应的ChromeDriver(不用更改Chrome版本)

为什么要这样 我们发现在 官网 下载ChromeDriver的地方&#xff0c;没有对于高版本的下载包&#xff0c;可是我们的浏览器版本是 117.0.5938.88&#xff0c;我又不想降低本地的Chrome版本&#xff0c;因为这样也太蠢了&#xff0c;每次更新后可能老版本就不适用了。 使用方法 …

9.2.3.1 【MySQL】XDES Entry链表

当段中数据较少的时候&#xff0c;首先会查看表空间中是否有状态为 FREE_FRAG 的区&#xff0c;也就是找还有空闲空间的碎片区&#xff0c;如果找到了&#xff0c;那么从该区中取一些零碎的页把数据插进去&#xff1b;否则到表空间下申请一个状态为 FREE 的区&#xff0c;也就是…

链表的分割——哨兵位

现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排列后的链表的头指针。 思路&#xff0c;把链表分成两个新链表&#xff0c;然后连接起来 代码…

vue3 @click那些事

vue3element-plus vue3 click那些事 1.动态决定click能否点击 1.动态决定click能否点击 只需要在点击事件前加一个判断条件

MTK联发科MT6762/MT8788安卓核心板性能参数对比

MT6762核心板是联发科的八核处理器&#xff0c;采用12nm制程工艺。MT6762具有集成的蓝牙、fm、WLAN和gps模块&#xff0c;是一个高度集成的基带平台&#xff0c;包括调制解调器和应用处理子系统启用LTE/LTE-A和C2K智能手机应用程序。MT6762芯片集成了ARM Cortex-A53&#xff0c…

乒乓球廉价底板和套胶对比分析

手机最近没办法写微博&#xff0c;在火车上没事&#xff0c;折腾了下&#xff0c;升级后可以了&#xff0c;我近期又打了很多套胶&#xff0c;我还录了段粘拍的视频一会分享。 这次我还是说几款底板和套胶的感受&#xff0c;最近买了dj200不带A底板&#xff0c;palio cc 和银河…