看板Programming
标 题Re: [问题] const 转换问题..
发信站批踢踢实业 (Tue Jun 23 06:39:47 2009)
转信站ptt2!news.ntu!ptt
※ 引述《besnow (~风中的羽翼~)》之铭言:
: 就是我现在有三个函式是
: A( const Packet *p)
: B(Packet *p)
: C(Packet *p)
: 而Packet是一个struct的型态。
: 现在原本是
: ===================================
: B (Packet *p){
: ...
: C(p);
: return;
: }
: ===================================
: 可是我现在希望可以透过A函式。可是又没法拿掉const。因为拿掉会有问题。
: 要变成:
: -----------------------------------
: B (Packet *p){
: ...
: A(p);
: retuen;
: }
: A (const Packet *p){
: ...
: C(p);
: ...
: return;
: }
: --------------------------------------
: 这样去写的话,第一个问题就是B要传进A的时候,Packet *p to const Packet *p
: 的部份会error,然後在A函式中,A要传进C时,同样的也会发生
乱讲,
B 把 p 传到 A 是 non-const 变成 const,
从较松的限制转成较严的限制怎麽可能会 error,
如果真的 error 请写信去向你的 compiler 制造商提出严重抗议,
都 2009 年了 C++ compiler 还写不好。
: const Packet *p to Packet *p 发生error。
: 如果用强制转。
: --------------------------------------
: B (Packet *p){
: ...
: A((const Packet*)p);
: retuen;
: }
: A (const Packet *p){
: ...
: C((Packet)p);
: ...
: return;
: }
: -----------------------------------------
这样写绝对是有问题,
C((Packet)p) 你这样是把 pointer type 硬转成非 pointer type,
除非是你已经知道它的行为故意这样用否则一定是写错;
以下我先当你是想写成 C((Packet *)) 继续说明。
: 可以complier过,可是里头东西都有问题。不是原本的那个packet。
: 所以想来请教一下,有什麽方式可以解决。或是说,有办法去转换型态?
: 还是非得要用memcpy的方式去一个一个做?..
: 想请教大大们,谢谢。
你要充分了解你自己的需求是什麽,
我只能跟你说 non-const 丢 const 这个方向是通的,
但是 const 丢 non-const 这个方向有 99% 的机率是你的设计概念出问题。
你的 A 绝对不可以接收 (const Packet *),
然後为了能丢 C 硬把 p 转成 (Packet *);
如果你的 C 本身真的不会改到 p 所指的空间,
你应该把 C 的参数也 const 化;
如果你的 C 本身会修改到 p 所指的空间,
你写 C((Packet *)p) 是绝对会出问题,
考虑下面程式码片段:
const Packet packet = { ... };
A(&packet);
如果输出的执行档格式支援 read-only section (如 ELF),
compiler 会把 packet 配置在 read-only section 上,
这时因为 A 宣称它不会改变 packet 内的值,
所以 compiler 放心的让你把 &packet 丢进去,
结果你的 A 却叫 C 去改了 packet,
这样的结果就是程式在执行到修改的地方时马上被 OS 强制终止;
总而言之这样写就是 A 本身的语意矛盾 (说不改又马上叫 C 去改),
而程式码出现语意矛盾都是设计者的设计概念有问题。
--
Ling-hua Tseng (
[email protected])
Department of Computer Science, National Tsing-Hua University
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Software pipelining for VLIW architectures
Homepage:
https://www.tinlans.org
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.160.105.96
※ 编辑: tinlans 来自: 118.160.105.96 (06/23 06:39)
1F:推 besnow:那个是我po文章时少打了一个"*"..谢谢你~ 122.116.252.48 06/23 10:20