C_and_CPP 板


LINE

这里给的错误讯息不明确, 推文中提到的型别检查变严格也不是原 . 在讲原因前先来了解赋値/初始化叙述最重要的几个要素: B = A; 当我们要把 A 赋値给 B 的时候, 至少需要弄清楚以下 3 点: 1. A 的型别为何? 2. B 的型别为何? 3. 可不可以透过隐式转换 (implicit conversion) 将 A 的型别转换到B 的型别? 简单举个例子, 我们都知道以下的程式码是合法的: int i = 0; int* pi = &i; // 1. pi's type is int* void* pv = pi; // 2. pv's type is void* // 3. valid, convert int* to void* 再回到原本的问题: char* str = "hello"; 在将 string literal 给 char* 物件做初始化之前, 你需要知道它 的型别是什麽, 据我所知在 C 和 C++ 内定义的型别不同: C (n2346) https://bit.ly/2lHYvLe 6.4.5.6 The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence. For character string literals, the array elements have type char, and are initialized with the individual bytes of the multibyte character sequence. C++ (n4830) https://bit.ly/2k3F5jL 5.13.5.6 An ordinary string literal has type “array of n const char” where n is the size of the string as defined below, has static storage duration, and is initialized with the given characters. 所以你的程式码效果其实和下面的差不多 (C++): const char literal[6] = {'h', 'e', 'l', 'l', 'o', '\0'}; char* str = literal; 会有错误的原因在这: 透过隐式转换无法将指标的 constness 给移除. 还有另外一个地方需要注意: 因为 string literal 本身是阵列, 阵列赋値/计算之前会先退化 (decay) 成指标 (也是转型的一种), 错误讯息省略描述这个步骤所以很容易让人误解它的型别. 最後总 结一下编译器做的事情: 1. 取得 "hello" 的型别, 为 const char[6] 2. 因为要赋値, 把 "hello" 阵列退化成 const char* 3. 取得 str 的型别, 为 char* 4. 检查能否透过隐式转换将 const char* 转成 char* (失败) 第一个步骤 C 和 C++ 编译器取得的型别相异, 导致结果也不同, 这也是常常拿网路上的原始码会编不过的原因, 其实 C 和 C++ 是 两个 (只有) 语法相似但本质不同的语言. -- P1389R0: Guidelines for Teaching C++ to Beginners https://bit.ly/2GvDWKb SG20 Education and Recommended Videos for Teaching C++ https://www.cjdb.com.au/sg20-and-videos --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.193.76.216 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1567782670.A.03A.html ※ 编辑: poyenc (123.193.76.216 台湾), 09/07/2019 03:23:11
1F:推 kaneson: 小弟认为隐转跟字串常数的建立是两回事的, 因为用显转就 09/07 09:42
2F:→ kaneson: 可解决。原po的问题我过去的记忆不曾遇到, 加上小弟最近 09/07 09:42
3F:→ kaneson: 在写c#(碰到不给隐转成parent class), 所以认为vs是朝向s 09/07 09:42
4F:→ kaneson: trong type checking一派的。而且原po的code来源因使用io 09/07 09:42
5F:→ kaneson: stream所以应为c++,(用.c丢给gcc/g++不给过) ,再来字串 09/07 09:42
6F:→ kaneson: 常数的隐转问题用gcc与g++及使用c++17都只有warning, 所 09/07 09:42
7F:→ kaneson: 以我觉得问题只是微软走严格趋势 09/07 09:42
8F:→ loveme00835: 楼上怎麽会有因为「只有 warning」所以程式码「不是 09/07 12:18
9F:→ loveme00835: ill-formed」的结论? 09/07 12:19
10F:推 kaneson: 因为只是要回答原po问的教学文章贴上却会报错的问题出在 09/07 17:47
11F:→ kaneson: 编译器差别不是语法或c/c++的差别。code本质对错就看此篇 09/07 17:47
12F:→ kaneson: 楼主就行了 09/07 17:47
13F:推 james732: 感谢回答 09/07 22:21







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP