头文件中的`static`、`extern`、`const`

2023-11-21

//a.h

extern int x1;
static int x2;
int x3;
static const int x4;

class A {
    public:
        static const int x5 = 10;
};

a.h将被多个包含.cpp文件,我的问题是:

1.x1只是一个声明,不是吗?所以它的定义应该在其中之一完成.cpp文件,对吗?

2.x2是一个定义,对吗?我曾经以为static int也是一个声明,就像extern int, 但是我错了。x2仅在以下位置可见a.h?

3.x3将被定义多次,如果a.h包含在多个.cpp文件,所以x3会导致编译错误,对吗?

4.x4是一个定义,对吗?

5.在A班,x5是一个声明,是的。但是关于x4?


1.x1 只是一个声明,不是吗?所以它的定义应该在这些 .cpp 文件之一中完成,对吧?

Correct

2.x2 是一个定义,对吧?我曾经以为static int和extern int一样也是一个声明,但是我错了。 x2 只在 a.h 中可见?

不同的x2将在包含标题的每个翻译单元中可用。

如果a.h包含在多个.cpp文件中,3.x3会被定义多次,所以x3会导致编译错误,对吗?

更准确地说,它将导致链接器错误。编译器处理每个翻译单元,链接器将它们绑定在一起并检测符号是否被定义了多次。

4.x4 是一个定义,对吗?

是的,这是一个定义,但就像x2每个翻译单元都有自己的x4(两者都是因为static因为它是const这意味着内部联系

5.这里在A类中,x5是一个声明,是的。但是x4呢?

Yes, x5仅是一个声明(带有初始化)。可能会出现混乱,因为关键字static在不同的上下文中被重用以表示不同的事物。在x5它的意思是类的属性, 而在x4它的意思是内部联系

最后一个例子比较特殊。它是唯一可以有值的声明 (IIRC),原因是它允许编译器use包含该标头的所有翻译单元中常量的值编译时间常数。如果该值必须与定义一起提供,则只有一个翻译单元可以访问该值。该静态成员的定义是:

const int A::x5; // no initialization here

如果会员是,则您必须提供一份odr-used。现在的事实是,在大多数情况下,常数不会是odr-used因为编译器将替换表达式时的值A::x5用来。仅当该会员被用作lvalue您需要定义,例如:

void f( const int & ) {}
int main() {
   f( A::x5 );
}

因为论证f是一个参考,使用A::x5需要一个lvalue(注意,常量性和左值/右值性几乎是正交的),这需要在程序中的单个翻译单元中定义成员。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

头文件中的`static`、`extern`、`const` 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现

随机推荐

  • 逐像素颜色转换 WriteableBitmap => 仅 PNG 黑色到透明颜色

    我正在开发一个 silverlight 应用程序 其中所有图标都是 PNG 的颜色all这些图标是黑色的 或者更确切地说是黑色到灰色的 具体取决于 Alpha 值 每个 PNG 都有透明背景 在我的应用程序中 我想要逐个像素地进行颜色更改
  • 如何知道

    如果滚动结束已到达 div 标签 我需要触发一个函数 page bind scroll function e page is the ID of the div im scrolling if document body scrollHei
  • 左侧带有箭头的微调器

    我正在开发一个 RTL 语言的应用程序 想要更改 Spinner 左侧箭头的位置 有没有办法在不创建自定义微调器的情况下执行此操作 您必须编写一个自定义微调器 示例代码如下 您可以根据需要进行编辑
  • 在 Swift 中获取两个日期(月/日/小时/分钟/秒)之间的差异

    我试图将当前日期之间的差异作为NSDate 和来自 PHP 的日期time 调用例如 NSDate timeIntervalSinceReferenceDate 1417147270 我如何获取两个日期之间的时间差 我想要一个比较两个日期的
  • 找到正值的零交叉和负值的零交叉

    我有一个信号 我想在以下情况下复制 1 从过零开始变为正值 2 复制一定数量的点 例如8000 3 复制完 8000 个点后 继续追加点 直到找到向下的过零部分 我可以找到零交叉点 但我在知道如何判断零交叉点何时变为正值和 或零交叉点变为负
  • 无法再打开 Spyder IDE 进行 Python 编程

    几个月前 我在我的 Windows 7 笔记本电脑上安装了 Python 3 4 作为 Anaconda 的一部分 https www continuum io downloads 我的安装包括 Spyder IDE 并且我已成功使用 Sp
  • ES6 中是否有对 ES5 `module.exports = require('./inner.js')` 的一行类比?

    before module exports require inner js nowadays export default from inner js 我正在尝试这样做 但是 babel 只允许在 es7 stage 1 中这样做目前的建
  • 自定义属性 - 是还是不是?

    最近 我阅读了越来越多关于人们在 HTML 标签中使用自定义属性的文章 主要是为了嵌入一些额外的数据以在 javascript 代码中使用 我希望收集一些反馈 了解使用自定义属性是否是一个好的做法 以及一些替代方案 看起来确实可以简化bot
  • MSBuild IIS 问题

    我正在使用 MSBuild 打包和发布我的 Asp Net MVC 3 Net 4 应用程序 我已经为 MVC 1 0 Net 3 5 应用程序成功完成了此操作 每当我包含 IIS 设置 IncludeIisSettings true 在我
  • ASP.NET MVC 视图模型最佳实践

    我的 ASP NET MVC 站点连接到 WCF 服务以获取数据 WCF 服务返回如下数据协定 DataContract public class Person DataMember public string First get set
  • 对特定 URL 强制使用 HTTPS

    这应该很快 这是我当前的 htaccess 文件 BEGIN WordPress
  • 在 vi/vim 中替换并保留某些“单词”

    例如 如果我有 asd word 123 我想把它替换为 this gt line word 123 保留 word 123 我怎么能这么做呢 通过使用这个 s asd this gt line g 我无法保留中间的措辞 请赐教 使用正则表
  • Perl:数组引用与匿名数组

    这可能是一个愚蠢的问题 以下代码输出的内容 arrayref and arraycont分别 请注意它们之间的区别以及它们的值分配方式 我知道匿名数组的作用 但有人能解释为什么有区别吗 非常感谢 arrayref array qw 1 2
  • 无法在 Ubuntu 14.04 上安装 python pip

    这是我用来安装 python pip 的命令 sudo apt get install python pip 我收到以下错误 Reading package lists Done Building dependency tree Readi
  • RDF 容器和集合之间的区别?

    我读过一本书 容器和集合之间的区别在于 容器始终是打开的 即 可以通过附加的 RDF 语句添加新成员 而集合可以是关闭的 我不太清楚这个区别 它表示不能将新成员添加到集合中 如果我改变最后一个的值怎么办rdf rest财产来自rdf nil
  • Django:是否有任何工具/技巧可用于调试 AJAX 响应?

    通常 当我从 ajax 调用中收到 500 Internal Server Error 时 我看不到响应的详细信息 因为您不想向用户显示它们 在服务器端 我只看到一行 GET xxx yyy HTTP 1 1 500 1150336 在不修
  • 从多个表中选择多个列

    我是 MySQL 的初学者 我很难弄清楚如何解决这个问题 我有两个表 每个表都有很多条目 假设这些是表 Table 1 Table 2 dt1 dt2 dt3 dt4 dt5 1 abc 3 wsx 123 7 asd 3 qax 456
  • 如何动态卸载 JavaScript 文件?

    我包含使用 Ajax 的页面 但我还需要包含它们各自的 javascript 文件 这需要同时从内存中删除以前的 javascript 文件 如何卸载当前加载的 JavaScript 文件 以及内存中的代码 以便加载新页面的文件 它们很可能
  • NGINX 反向代理因链接 Docker 容器而失败

    我有以下内容docker compose yml node1 build node links redis ports 8080 node2 build node links redis ports 8080 service1 build
  • 头文件中的`static`、`extern`、`const`

    a h extern int x1 static int x2 int x3 static const int x4 class A public static const int x5 10 a h将被多个包含 cpp文件 我的问题是 1