作者justhere (发废文就是生活的小确幸)
看板C_and_CPP
标题[问题] initializer 的具体作用
时间Fri May 1 23:54:00 2020
各位好,小弟新手,
目前在看C++ primier fifth edition,
进度到variable的定义与宣告这个小节,
在讲extern 这个keyword时书中举一个小范例:
extern int i;
// declares but does not define i
int j;
// declares and defines i
他解释
To obtain a declaration that is not also a definition,
we add extern keyword and may not provide an explicit initializer
请问具体来说c++中initializer所做的事情是什麽呢?
是分配记忆体位置和值给该name吗?
感谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.254.198.63 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1588348442.A.31D.html
1F:→ loveme00835: 这样写其实是要方便记忆, extern 和 linkage type 息 05/02 00:41
2F:→ loveme00835: 息相关, 书中已经提到 translation unit 的概念了吗? 05/02 00:41
目前还没看到
但有说之後章节会再重复提到这些概念
3F:推 CoNsTaR: declaration 或 definition 不是由 extern 直接决定 05/02 05:13
4F:→ CoNsTaR: 如果有 assignment 就是 definition,否则为 declaration 05/02 05:13
5F:→ CoNsTaR: declaration 分配记忆体,definition 给值 05/02 05:13
6F:→ CoNsTaR: 这里会说 extern int i 是 declaration 单纯是因为你不 05/02 05:13
7F:→ CoNsTaR: 能在 extern 的同时 assign,既然没有 assignment,所以 05/02 05:13
8F:→ CoNsTaR: 是 declaration 05/02 05:13
9F:→ CoNsTaR: int j 一样是 declaration,因为没有 assignment 05/02 05:13
10F:→ CoNsTaR: int j = i 才算是 definition 05/02 05:13
感谢C大,说得很清楚!
※ 编辑: justhere (111.254.203.171 台湾), 05/02/2020 08:57:19
11F:→ loveme00835: 谁说 extern 就不能 assign 初始值? 讲 extern 如果 05/02 10:21
12F:→ loveme00835: 没有讲 linkage 那就不是正确的理解 05/02 10:21
13F:→ justhere: 所以要先补後面的章节才比较完整吗? 那我先略过这边的 05/02 11:23
14F:→ justhere: 疑问了 感谢以上大大的回答 05/02 11:24
15F:推 ucrxzero: 楼上都错 05/02 11:50
16F:→ loveme00835: 加 extern 预设编译器只会把名称引进来, 多个 extern 05/02 12:36
17F:→ loveme00835: 引进的名称最後都会参考到同一个物件, 而这个物件可 05/02 12:38
18F:→ loveme00835: 以在不同的程式码档 (translation unit) 里定义, 但 05/02 12:40
19F:→ loveme00835: 在编出来的 program 里最多只允许一个. 加了 extern 05/02 12:44
20F:→ loveme00835: 的 declaration 也可以透过明确初始化来提升为书里讲 05/02 12:44
21F:→ loveme00835: 的定义, 也就是决定物件实体所在的位置. extern 只能 05/02 12:47
22F:→ loveme00835: 拿来参考具有 external linkage 的物件, 如果你把 i 05/02 12:48
23F:→ loveme00835: 的 decl 前方加上 static 那不给初始值的 extern 就 05/02 12:50
24F:→ loveme00835: 没用了 (如果每个地方都用 extern 而不去决定实体位 05/02 12:50
25F:→ loveme00835: 置, 最後这个物件就不存在) 05/02 12:51
26F:→ loveme00835: 其实 int j; 算是"宣告"并决定物件的初始値和位置, 05/02 13:07
27F:→ loveme00835: 书里把它说成"定义"是想和函式宣告作个区别 05/02 13:09
28F:→ justhere: 书中在本小节有提到sperate compilation 感觉就是L大所 05/02 13:13
29F:→ loveme00835: 等你学到 class static data member 的时候也可能被 05/02 13:13
30F:→ justhere: 说的translation unit? 05/02 13:13
31F:→ loveme00835: 书里的这种分类给混淆 05/02 13:13
32F:→ loveme00835: 对喔, 语言本身是设计可以分开编译再连结执行的, 这 05/02 13:14
33F:→ loveme00835: 时候物件的实体放在哪里的这观念就很重要, extern 基 05/02 13:15
34F:→ loveme00835: 本上就是设计来跨 translation unit 参考 05/02 13:15
35F:→ protoss: 我一直以为int j;其实已经算定义了? 05/02 19:08
36F:→ stucode: 根据标准 int j; 是定义没错。 05/02 19:47
38F:→ loveme00835: 严格来说不是语法决定定义与否, 而是由情境来决定 05/02 20:26
39F:→ loveme00835: 宣告就是宣告, 但某些情境下宣告即定义 05/02 20:27
40F:→ eye5002003: 其实include就是将标头档的内容给复制贴上,明白这点 05/07 12:27
41F:→ eye5002003: 就可以想通很多问题了,也很自然的理解extern了 05/07 12:28