[问题] initializer 的具体作用

楼主: justhere (发废文就是生活的小确幸)   2020-05-01 23:54:00
各位好,小弟新手,
目前在看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吗?
感谢
作者: loveme00835 (发箍)   2020-05-02 00:41:00
这样写其实是要方便记忆, extern 和 linkage type 息息相关, 书中已经提到 translation unit 的概念了吗?
作者: CoNsTaR ((const *))   2020-05-02 05:13:00
declaration 或 definition 不是由 extern 直接决定如果有 assignment 就是 definition,否则为 declarationdeclaration 分配内存,definition 给值这里会说 extern int i 是 declaration 单纯是因为你不能在 extern 的同时 assign,既然没有 assignment,所以是 declarationint j 一样是 declaration,因为没有 assignmentint j = i 才算是 definition
作者: loveme00835 (发箍)   2020-05-02 10:21:00
谁说 extern 就不能 assign 初始值? 讲 extern 如果没有讲 linkage 那就不是正确的理解
楼主: justhere (发废文就是生活的小确幸)   2020-05-02 11:23:00
所以要先补后面的章节才比较完整吗? 那我先略过这边的疑问了 感谢以上大大的回答
作者: ucrxzero (RX-0)   2020-05-02 11:50:00
楼上都错
作者: loveme00835 (发箍)   2020-05-02 12:36:00
加 extern 默认编译器只会把名称引进来, 多个 extern引进的名称最后都会参考到同一个物件, 而这个物件可以在不同的程式码档 (translation unit) 里定义, 但在编出来的 program 里最多只允许一个. 加了 extern的 declaration 也可以透过明确初始化来提升为书里讲的定义, 也就是决定物件实体所在的位置. extern 只能拿来参考具有 external linkage 的物件, 如果你把 i的 decl 前方加上 static 那不给初始值的 extern 就没用了 (如果每个地方都用 extern 而不去决定实体位置, 最后这个物件就不存在)其实 int j; 算是"宣告"并决定物件的初始値和位置,书里把它说成"定义"是想和函式宣告作个区别
楼主: justhere (发废文就是生活的小确幸)   2020-05-02 13:13:00
书中在本小节有提到sperate compilation 感觉就是L大所
作者: loveme00835 (发箍)   2020-05-02 13:13:00
等你学到 class static data member 的时候也可能被
作者: protoss (天生散人)   2020-05-02 19:08:00
我一直以为int j;其实已经算定义了?
作者: stucode   2020-05-02 19:47:00
根据标准 int j; 是定义没错。https://eel.is/c++draft/basic.def#2
作者: loveme00835 (发箍)   2020-05-02 20:26:00
严格来说不是语法决定定义与否, 而是由情境来决定宣告就是宣告, 但某些情境下宣告即定义
作者: eye5002003 (下一夜)   2020-05-07 12:27:00
其实include就是将标头档的内容给复制贴上,明白这点就可以想通很多问题了,也很自然的理解extern了

Links booklink

Contact Us: admin [ a t ] ucptt.com