C static 关键字与 C++ 私有作用域?

2024-03-05

本地翻译单元的 C++ 等效项是什么staticC 中的函数?
例如有以下内容bar.c:

static void bar() {
    // ...
}

在C++中,这会被写成私有成员函数吗?

class foo {
    void bar();
};

void foo::bar() {
    // ...
}

私有成员函数隐式引入了this指针作为参数,所以它不能与C风格相比static功能。但即使是一个private static成员函数bar()将在公共接口中看到(并保持链接器的可访问性),并且也不具有可比性。

虽然这些函数的可访问范围似乎相似,但这些选项看起来并不是上述 C 风格的良好替代品static函数语法。

是否相当于未命名命名空间中的函数,仅对当前翻译单元可见?

namespace {
    void bar() {
       // ...
    }
}

[C] 具有文件作用域的静态函数。

static void bar() { ... }

这将创建一个名为的函数bar具有内部联系。

[C++] 具有文件作用域的静态函数

static void bar() { ... }

这将创建一个名为的函数bar具有内部联系。

[C++] 未命名命名空间

namespace {
    void bar() { ... }
}

这将创建一个名为的函数bar具有内部联系。

结论

他们都是完全相同的。我可能会建议在 C++ 中使用未命名的命名空间,因为它消除了一些重载static关键词。但从代码的作用来看,这并不重要。

侧边栏:内部链接是什么意思?

在 C 和 C++ 中,我们有三种链接:External, Internal and 无联动。为了定义这些,我将引用 C++ 2011 第 3.5 节第 2 段:

当一个名称可能表示与另一个作​​用域中的声明引入的名称相同的对象、引用、函数、类型、模板、命名空间或值时,则称该名称具有链接:

  • 当名称具有外部链接时,它所表示的实体可以通过其他翻译单元范围或同一翻译单元的其他范围的名称来引用。
  • 当名称具有内部链接时,它所表示的实体可以被同一翻译单元中其他范围的名称引用。
  • 当名称没有链接时,它所表示的实体不能被其他范围的名称引用。

C 2011 在第 6.2.2 节第 2 段有类似的语言:

在构成整个程序的翻译单元和库的集合中,具有外部链接的特定标识符的每个声明都表示相同的对象或函数。在一个翻译单元内,具有内部链接的标识符的每个声明都表示相同的对象或函数。没有链接的标识符的每个声明都表示一个唯一的实体。

因此,具有内部链接的名称仅在找到它们的翻译单元中可见。

侧边栏:让我们举一个内部链接在实践中如何工作的示例:

让我们创建 2 个 c++ 文件。bar.cc将仅包含一个具有内部链接的函数:

static void bar() {}

我们还将创建main.cc,它将尝试使用它bar().

extern void bar();

int main() {
    bar();
}

如果我们编译它,我们的链接器会抱怨。没有名为的函数bar我们可以从 main.cc 翻译单元中找到。这是内部链接的预期行为。

Undefined symbols for architecture x86_64:
  "bar()", referenced from:
      _main in main-c16bef.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C static 关键字与 C++ 私有作用域? 的相关文章

随机推荐

  • 卸载使用 CUDA 内存的 mex 文件时 MATLAB 崩溃

    我已经尝试解决这个问题有一段时间了 我在使用 CUDA 的 matlab Linux 64 位 中使用 MEX 文件 代码编译并执行得很好 但是当我想卸载 mex 时 例如重新编译它或当 matlab 退出时 matlab 立即崩溃 没有任
  • new File(path) 实际上总是在 android 上创建一个文件?

    我正在尝试检查 Android SD 卡上是否存在文件 所以我这样做 File f new File sdpath DATABASE NAME if f exits create new file else do something 每次实
  • 如何在弹出窗口中动态创建 HTML 元素?

    之前 我使用 window showModalDialog 函数弹出一个窗口 window showModalDialog myHtml 在 myHtml 中 有一些 html 元素 例如文本区域和两个按钮 但现在情况发生了变化 任何htm
  • 查找用户位置

    我正在尝试获取我的天气应用程序的用户位置 我目前无法这样做 并尝试遵循 Google 最后已知位置指南以及https guides codepath com android Retriving Location with LocationS
  • 通过 GitHub 发布 Webhook 触发 AWS CodePipeline

    AWS CodePipeline 现在支持 GitHub WebHook 但默认情况下每次在主分支上推送 更改 代码时 都会触发 CodePipeline 但是 我只希望它在我实际发布版本时运行 因此 我手动配置了自动生成的 GitHub
  • 设置具有多个值的本地化字符串的格式

    我创建了一个本地化字符串 其形式类似于 text key Collected d out of d 并使用以下格式化程序 let numberOfItems 2 let totalNumberOfItems 10 let format NS
  • 在R中过滤掉多列

    假设一个数据集有多个行和列 其中一些列为 0 我的意思是该列中的所有值都是 0 如何过滤掉这些列 我已尝试使用以下代码但无济于事 training data lt Filer function x all x 1 99 0 training
  • Flutter - 轻按时检测 TextField

    我在 Windows 中制作了一个 Flutter 应用程序并且一切正常 但是当我尝试编译到 iOS 时抛出了意外错误 在文本字段中检测到 onTap 不是正确的参数 我不知道会发生什么 在 Windows 中不会返回此错误 反正 有人知道
  • 设置输入高度为父级的 100%

    我在设置输入 键入文本 高度以适合 100 的父母时遇到了一些问题 td 高度 我什至尝试迭代每个输入并使用 jQuery 手动设置它的高度 但这需要相当多的时间 我正在处理的网站有很多单元格 并且仍然无法在 IE 7 和 8 上工作 我有
  • 将表单身份验证添加到 ASP.Net 项目会导致 401.2 未经授权?

    我正在尝试将表单身份验证插入到最初使用 VS 2013 和 ASP Net 4 0 使用无身份验证模板创建的 ASP Net 项目中 我已遵循 MSDN 上的建议 并将其添加到 system web 下的 Web Config 中
  • 添加资源文件到xcode

    我正在尝试将一些新的资源文件添加到由另一个人在另一台 Mac 上构建的项目中 我认为该项目有前人的规定 使用右键单击 gt 将文件添加到 MyProject 不会提供预期的结果 编译项目后 添加的文件在应用程序中不可见 如何在我的项目中添加
  • 最新的 Jersey 示例不起作用

    我已经安装了最新版本的球衣 捆绑版本 2 13 0 以及该版本的示例 然后我尝试了 用于测试 Restful 服务 examples helloworld pure jax rs src main java org glassfish je
  • JavaScript 加载图像的进度

    JS 有没有办法在加载图像时获取加载图像的进度 我想使用HTML5新的Progress标签来显示加载图像的进度 我希望有这样的东西 var someImage new Image someImage onloadprogress funct
  • MongoDB - 大量 MongoCleaner 线程

    不知何故 我的 java 应用程序与 mongodb 通信最终产生了大量名为 MongoCleanerXXX 的停放 睡眠 线程 我认为它来自驱动程序 其数量约为 600 显然数据库存在一些连接问题 在 mongod 重新启动一段时间后确实
  • 我的 httpd.conf 是空的

    我最近在 ubuntu 上安装了 apache2 但我有一个问题 我的 httpd conf 是空的 有人能给我一份 ubuntu 上 apache2 的 httpd conf 的干净副本吗 谢谢 编辑 我看到了你的答案 但在 wampse
  • 如何让dput删除多余的数据?

    我想要一个 SO 问题的最小可重现代码 我一直在使用dput droplevels head df 50 然而 df大约有 4k 条记录 看起来像dput正在为每个人打印一些东西 我需要在问题中显示两个不同的 df 所以不会让我超过 30
  • 打字稿中具有数据水合/脱水的类

    我想分享 React TS 前端和 Node TS 后端之间的 TS 类或接口 问题是 TS 类型在编译时被剥离 所以当我想将类实例转换为 JSON 时我无法使用它们 我想知道是否有任何解决方案可以在静态文件中描述我的对象 生成 TS 类
  • 在 .Net 2.0 中对 IList 进行排序的最佳方法是什么?

    我有一个IList
  • 当调试器设置为 LLDB 时,Xcode 4 挂起附加到(应用程序名称)

    当我在模拟器中运行应用程序时 Xcode 挂在 附加到 应用程序名称 上 但这仅在调试器设置为 LLDB 时发生 当调试器设置为 GDB 时 应用程序运行良好 产品 gt 编辑方案 gt 运行 gt 调试器 如何修复此问题以使用 LLDB
  • C static 关键字与 C++ 私有作用域?

    本地翻译单元的 C 等效项是什么staticC 中的函数 例如有以下内容bar c static void bar 在C 中 这会被写成私有成员函数吗 class foo void bar void foo bar 私有成员函数隐式引入了t