书上的一段话不理解,关于多个文件中常量定义的问题

hhddzz 2010-12-31 04:52:58
这是Primer上的一段

在程序编译期间,在可能的情况下 ,符号常量的值会代替该名字的出现。 这个替代过程
被称为常量折叠 (constant folding )。例如, 当 INLINE 被用在一个文件中时 ,编译器用 128
代替名字 INLINE。
为了使编译器能够用一个常量值替换它的名字 ,该常量的定义 (它的初
始值 )必须在它被使用的文件中可见。因为这个原因 符号常量可以在同一程序的不同文件
中被定义多次。 尽管理想情况下, 一个具有初始值的常量可以被包含在多个不同的文件中 。
但是常量折叠使其变得并不必需 ,甚至在可执行文件只要出现一次就行。”

根据这段文字,我的理解是:
因为要实施常量折叠--->常量的初始值必须在使用它的文件中可见---->常量必须在每个使用它的文件中定义----->C++语法允许常量在不同文件中多次定义
也就是说,因为要实现常量折叠,所以要在每个用到常量的文件里定义一次
但最后一句又说“常量折叠使其变得并不必需 ,甚至在可执行文件只要出现一次就行。”
而且,第一句开头就说了,常量折叠是“在程序编译期间”。既然是在编译期间,那和可执行文件就没多大关系了吧,为什么要在可执行文件中出现一次。
...全文
153 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhddzz 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pengzhixi 的回复:]

因为要实现常量折叠,所以要在每个用到常量的文件里定义一次

你这里理解明显反了,是因为有常量折叠,所以每个文件都可以定义。
[/Quote]
你说得对,如果是不能折叠的常量,就不能在每个文件中定义。只有在头文件中extern声明,在某个代码文件中定义
hhddzz 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pengzhixi 的回复:]

我用extern声明也是可见。我到觉得不是为了实现这个必须每个文件定义,而是因为这个所以每个文件可以定义
[/Quote]
我理解了,大概就是像内联函数那样
要求编译器在处理每个文件时都能访问常量的定义
pengzhixi 2010-12-31
  • 打赏
  • 举报
回复
我用extern声明也是可见。我到觉得不是为了实现这个必须每个文件定义,而是因为这个所以每个文件可以定义
hhddzz 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pengzhixi 的回复:]

因为要实现常量折叠,所以要在每个用到常量的文件里定义一次

你这里理解明显反了,是因为有常量折叠,所以每个文件都可以定义。
[/Quote]
书上这句话

为了使编译器能够用一个常量值替换它的名字 ,该常量的定义 (它的初
始值 )必须在它被使用的文件中可见。”
就是那么理解吧
pengzhixi 2010-12-31
  • 打赏
  • 举报
回复
因为要实现常量折叠,所以要在每个用到常量的文件里定义一次

你这里理解明显反了,是因为有常量折叠,所以每个文件都可以定义。
太乙 2010-12-31
  • 打赏
  • 举报
回复
由于历史原因,const 还是要保留到链接的时候的,这里应该说是在链接阶段,只需要出现一次即可。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧