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

简介: 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;
}
  • 注意OtherClass类可以访问accessParamBuilder.

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;
}
  • 注意OtherClass类不可以访问tryAccessParamBuilder.

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;
}
  • 注意OtherClass类可以访问accessParamBuilderFunction.

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;
}
  • 注意OtherClass类不可以访问tryAccessParamBuilderFunction.

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

class OtherClass {
public:void accessParamBuilder() {ParamBuilder pb;// 调用和操作 ParamBuilder}
};class ParamBuilder {
public:void publicFunction() {// 公共函数的实现}
};int main() {OtherClass oc;oc.accessParamBuilder();return 0;
}
  • 注意OtherClass类完全可以访问accessParamBuilder.

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

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

相关文章

window便捷使用技巧(LTS)

目前很乱,有空整理 %AppData%\Microsoft\Windows\Recent\AutomaticDestinations Windows应用程序设置快捷键 AutoHotkey组合键设置 热键重复调用 powertoy工具连接 Windows常用shell命令 2 台电脑共享键鼠最简单教程 QTTabBar 「资源管理器」该有的样子 win10电脑…

为什么网络安全缺口很大,而招聘却很少?学网络安全真的没有前途吗?

2020年我国网络空间安全人才数量缺口超过了140万,就业人数却只有10多万,缺口高达了93%。这里就有人会问了: 1、网络安全行业为什么这么缺人? 2、明明人才那么稀缺,为什么招聘时招安全的人员却没有那么多呢&#xff1…

设计模式再探——宏观篇

目录 一、背景介绍二、思路&方案三、过程1.宏观介绍2.目的与意义3.七大原则的定义与边界4.思路由来 四、总结五、升华 一、背景介绍 最近在做产品技术建模的过程中,一些地方刻意用到了设计模式,而一些地方也用到了但是并不是很明确。 于是乎就带着…

容器核心技术之Namespace与Cgroup

容器是一种流行的虚拟化技术,它允许我们在同一台计算机上与其他进程在独立环境中运行进程。那么容器是如何做到这一点的呢?为此,容器是从 Linux 内核的一些新功能构建的,其中两个主要功能是“namespace”和“cgroup”。 1.Namespa…

蓝桥杯 题库 简单 每日十题 day5

01 字符计数 字符计数 题目描述 给定一个单词,请计算这个单词中有多少个元音字母,多少个辅音字母。 元音字母包括a,e,i,o,u,共五个,其他均为辅音字母。 输入描述 输入格式: 输入一行&#xff0…

形式化验证方法研究综述

摘要:形式化验证是证明软件、硬件或系统正确性的一种方法,近年来受到了越来越多的关注。 本文对形式化验证的研究进行了综述。首先介绍了形式化验证的基本概念,然后重点介绍了形式化验证的三种技术,包括模型检测、定理证明和等价性…

华为华三40G带宽互通连接测试

郁闷了几天了,今天竟然做了件爽事!慢慢说来。 今天下雨,下午娃上学,我送老婆去学校上课。之后到实验室,今年申请买的两台交换机正好送到: S5500V2-54S-EI:48个10/100/1000TX以太网端口&#x…

三维模型3DTile格式轻量化在数据存储的重要性分析

三维模型3DTile格式轻量化在数据存储的重要性分析 三维模型3DTile格式轻量化在数据存储中占有重要地位。随着科技的不断发展,尤其是空间信息科技的进步,人们对于三维地理空间数据的需求日益增长。然而,这类数据通常具有大尺度、高精度等特点&…

stdio.h

1.#include <corecrt.h> 1.1#include <vcruntime.h> 2.#include <corecrt_wstdio.h> 2.1#include <corecrt.h> 2.2#include <corecrt_stdio_config.h> 2.2.1#include <corecrt.h>

实例讲解Spring boot动态切换数据源

前言 在公司的系统里&#xff0c;由于数据量较大&#xff0c;所以配置了多个数据源&#xff0c;它会根据用户所在的地区去查询那一个数据库&#xff0c;这样就产生了动态切换数据源的场景。 今天&#xff0c;就模拟一下在主库查询订单信息查询不到的时候&#xff0c;切换数据…

nacos-api

登录 http://xx:8848/nacos/v1/auth/users/login?usernamexx&passwordxx 查询配置 http://xx:8848/nacos/v1/cs/configs?dataIdtest&grouptest&tenant5d24ca22-e3b0-4808-ba58-bbeeffa02195

[C++基础]-继承

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、模板的…

(23)认识Linq:序列与集合,延迟与缓存,链式与查询式,性能提升技巧

本文参考https://www.bilibili.com/video/BV1rx41157DS/?p6&spm_id_from333.880.my_history.page.click&vd_source2a0404a7c8f40ef37a32eed32030aa18 难度&#xff1a;中级 一、Enumerables与IEnumerable 1、什么是Enumerables? (1)Enumerabl…

LabVIEW崩溃问题解决方法

LabVIEW崩溃问题解决方法 LabVIEW在运行中出现崩溃的情况&#xff0c;确实让人很崩溃。不过按照下面的方法可以逐步排查解决。 在LabVIEW开发环境中浏览时&#xff0c;LabVIEW崩溃并显示以下错误&#xff1a; 解决方案 LabVIEW内部错误和崩溃的初步故障排除步骤&#xff1a;…

【蓝桥杯选拔赛真题62】Scratch判断小球 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch判断小球 一、题目要求 编程实现 二、案例分析 1、角色分析

bleve全文检索实现站内搜索(Go 搭建 qiucode.cn 之十)

一说到全文检索这个词时,最先蹦出在脑海中的必然是Elasticsearch,毕竟国内碗Java是多于其他编程语言的。 然而,这两者并不具有可比性,就像一个编程语言与另一个编程语言的较量,说这个编程语言优于那个编程语言。 每个编程语言的存在总是为了解决当下的问题,当然咯,一个项…

docker 操作redis

1查看容器 2进入容器 exec表示在运行的容器中执行命令it表示以终端交互的方式执行命令/bin/bash表示需要指定的命令 3进入容器后可通过redis-cli命令连接容器内的redis服务器&#xff0c;可通过set创建变量&#xff0c;get获取变量的值 4key * 查看所有key 通过ping 查看redi…

从CNN(卷积神经网络),又名CAM获取热图

一、说明 卷积神经网络&#xff08;CNN&#xff09;令人难以置信。如果你想知道它如何看待世界&#xff08;图像&#xff09;&#xff0c;有一种方法是可视化它。 这个想法是&#xff0c;我们从最后的密集层中得到权重&#xff0c;然后乘以最终的CNN层。这需要全局平均…

前端 JS 经典:apply、call、bind

1. 概念 都是用来改变函数中 this 指向的。区别在于 apply、call 传参方式不一样&#xff0c;调用后&#xff0c;直接执行函数。bind 调用后&#xff0c;返回一个函数体&#xff0c;不直接执行函数。 2. 为什么用 那为什么要改变 this 指向呢。正常情况下&#xff0c;谁调用…

安防监控视频云存储平台EasyNVR对接EasyNVS时,一直不上线该如何解决?

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。 近期有用户在使用安防视频平台EasyNVR对接上级平台EasyNVS时&#xff0c;出现了一直不上线…