分享
 
 
 

转贴:C++语言常见问题解:#121 ~ #140

王朝c/c++·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

这是我从台湾的http://www.cis.nctu.edu.tw/chinese/doc/research/c++/C++FAQ-Chinese/发现的《C++ Frequently Asked Questions》的繁体翻译,作者是:叶秉哲,也是《C++ Programming Language》3/e繁体版的译者,该文章是非常的好,出于学习用途而将它转贴,本人未取得作者的授权,原文章的版权仍然归属原作者.

C++语言常见问题解

Q121:「泛型」(genericity)是什么?

另一种 "class template" 的说法。

不要和「一般化」(generality,指不要过于特定的解题)弄混了,「泛型」指的是

class template。

=======================

■□ 第20节:链接库

=======================

Q122:怎样拿到 "STL"?

"STL" 代表 "Standard Templates Library",标准模版链接库。取得法:

STL HP official site: ftp://butler.hpl.hp.com/stl

STL code alternate: ftp://ftp.cs.rpi.edu/stl

STL code + examples: http://www.cs.rpi.edu/~musser/stl.html

STL hacks for GCC-2.6.3 已经在 GNU libg++ 2.6.2.1 或更新版本里了(可能较早

的版本也有)。多谢 Mike Lindner。

========================================

Q123:怎样 ftp 到 "Numerical Recipes" 附的程序?

它是用卖的,把它放到网络上散布是违法的。不过它只需 $30 美元而已。

========================================

Q124:为什么我的执行档会这么大?

很多人对这么大的执行档感到惊讶,特别是当原始码只有一点点而已。例如一个简单

的 "hello world" 程序居然会产生大家都想不到的大小(40+K bytes)。

一个原因是:有些 C++ 执行期链接库被连结进去了。有多少被连结进去,就要看看

你用到多少,以及编译器把链接库切割成多少块而定。例如,iostream 很大,包含

一大堆类别及虚拟函数,即使你只用到一点点,因为各组件之间的交互参考依存关系

,可能会把整个 iostream 程序代码都塞进来了。(【译注】如果 linker 做得好的话

,应该能把完全用不到的组件 object code 砍掉,不随之塞入你的执行档中。)

不要用静态的,改用动态连结的链接库版本,就可以使你的程序变小。

欲知详情,请看看你的编译器手册,或是寻求厂商的技术支持。

===============================

■□ 第21节:特定系统的细节

===============================

Q125:GNU C++ (g++) 把小程序造出大大的执行档,为什么?

libg++(g++ 用到的链接库)可能在编译时带有除错的信息(-g)。有些机器上,不

带除错信息地重新编译它,会省下很大的磁盘空间(~1 MB;缺点是:不能追踪到

libg++ 的呼叫)。仅仅 "strip" 掉执行档,比不上先用 -g 重新编译,再 "strip"

掉 a.out 档来得有效。

用 "size a.out" 来看看执行码的程序与资料区段到底占了多大空间,而不要用

"ls -s a.out" 这种包括了符号表格(symbol table)的方式。

========================================

Q126:有 YACC 的 C++ 文法吗?

Jim Roskind 是 C++ 的 YACC 文法作者,它大体上和部份 USL cfront 2.0 所实作

出来的语言兼容(没有 template、例外、执行期型态识别功能)。这份文法有些地

方和 C++有细小而微妙的差别。

它可用 anonymous ftp 到下列地方取得:

* ics.uci.edu (128.195.1.1) in "gnu/c++grammar2.0.tar.Z".

* mach1.npac.syr.edu (128.230.7.14) in "pub/C++/c++grammar2.0.tar.Z".

========================================

Q127:什么是 C++ 1.2? 2.0? 2.1? 3.0?

这些不是“语言”的版本,而是 cfront 这个由 AT&T 做出来的、最早的 C++转译程

式的版本编号。以这编号来“代表”C++ 语言的演进,已经是公认的惯例了。

“非常”粗略地讲,主要的特征有:

* 2.0 包含多重/虚拟继承,以及纯虚拟函数。

* 2.1 包含半巢状 (semi-nested) 类别,及 "delete [] 数组指针"。

* 3.0 包含全巢状 (fully-nested) 类别、template 和 "i++" vs "++i"。

* 4.0 将包含例外处理。

========================================

Q128:如果签名编码标准化了,我能否将不同厂商编译器产生的程序代码连结起来?

简短的回答:可能不行。

换句话说,有人希望标准化的签名编码规则能并入拟议中的 C++ ANSI 标准,避免还

要为不同厂商的编译器购买不同版本的对象链接库。然而不同的系统实作中,签名编

码的差异性只占一小部份而已,即使是在同一个基台(platform)上。这里列出一部

份其它的差异处:

1) 成员函数隐含的自变量个数和型态。

1a) 'this' 有被特殊处理吗?

1b) 传值的指针放在哪里?

2) 假设有用到 vtable 虚拟表格的话:

2a) 它的内容及配置?

2b) 多重继承时,'this' 在何处/如何调整?

3) 类别如何配置,包含:

3a) 基底类别的位置?

3b) 虚拟基底类别的处理?

3c) 虚拟表格指针的位置,如果有用虚拟表格的话?

4) 函数的呼叫惯例,包含:

4a) 呼叫者还是被呼叫者负责调整堆栈?

4b) 实际参数放到哪里?

4c) 实际参数传递之顺序?

4d) 缓存器如何存放?

4e) 传回值放到哪里?

4f) 对传入/传回 struct 或 double 有无特殊的规定?

4g) 呼叫末端函数(leaf function)有无特殊的缓存器存放规定?

5) run-time-type-identification 如何配置?

6) 当一个例外被 throw 时,执行期的例外处理系统如何得知哪一个区域对象该被解

构?

=======================================

■□ 第22节:其它的技术和环境的事项

=======================================

● 22A:其它的技术事项

========================

Q129:为什么有 static 资料成员的对象类别产生了 linker 错误?

Static 的数据成员必须外显地在唯一的模块中定义。

^^^^^^ ~~~~~~^^^^ ^^^^

【译注】这句话要逐字细读。原文是:Static data members must be

explicitly defined in exactly one module.

譬如:

class Fred {

public:

//...

private:

static int i_; // 宣告 static 资料成员 "Fred::i_"

//...

};

Linker 会告诉你 "Fred::i_ is not defined(未定义)" ,除非你在任何一个(且

唯一)原始档中定义(而非宣告)了 "Fred::i_" :

int Fred::i_ = 某个会产生 int 的表达式;

或是:

int Fred::i_;

通常我们会在 "Fred.C" 档中定义 "Fred" 类别的 static 资料成员(或 "Fred.cpp"

等等你使用的扩展名)。

========================================

Q130:"struct" 和 "class" 关键词差别在哪?

struct 的成员和基底类别, 都是预设为 public 的,而 class 则预设为 private。

注意:你应该“明显地”把基底类别设为 public、private 或是 protected,而不

要依赖默认值。

除此之外,两者的功能是相等的。

========================================

Q131:为什么不能以函数的传回值来多载(overload)它?

如果你同时宣告了 "char f()" 及 "float f()" ,编译器会给你个错误讯息,因为

呼叫 "f()" 会造成仿真两可的情况。

========================================

Q132:什么是「持续性」?什么是「持续性对象」?

一个持续性对象 (persistent object),在创造它的程序执行结束后,仍可存活下来

。它甚至可存活于不同的父程序,存活于磁盘系统、操作系统、甚至于操作系统所处

的硬件上。

持续性对象的困难在于:如何有效地在次储存体中,存放它们的运作行为(method)

及资料位(以及所有成员对象的资料和运作行为,及它们所有的成员对象、基底类

别……等等)。这一切都得自己来做的话,可不是件容易的事。在 C++中,你就得自

己来。C++/OO 的数据库系统,会替你把这些机制都隐藏起来。

========================================

Q133:为什么浮点数 (floating point) 这么不精确?为什么这段程序不会印出 0.43?

#include<iostream.h>

main()

{

float a = 1000.43;

float a = 1000.0;

cout << a - b << '\n';

}

(附注,有些 C++ 环境下会印出 0.429993)

声明:受进位/舍位/近似值之苦,其实并不是 C++ 的问题,而是计算机科学界的问

题。不过还是一直有人在 comp.lang.c++ 里发问,所以我给你一个答案意思一下。

答案:浮点数本来就是个近似值。在 IEEE 的 32 位浮点数标准里,有 1 位的

正负号,8 位的指数,23 位的假数。因为正规化后的二进制假数都会变成像是

1.xxxxx... 的型式,所以头一项的 1 不予计入,就能得到 24 位的有效假数。

1000.43(以及其它很多很多数字)都不是 float 或 double 的表示法,其实

1000.43 的位内容是这样子的('s' 代表正负号,'e' 代表指数,'m' 代表假数)

seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm

01000100011110100001101110000101

假数移位后变成 1111101000.01101110000101 或是 1000 + 7045/16384。

分数部份为 0.429992675781。

float 的假数占 24 位,所以你只得到 16M 分之一的精确度。

double 有较高的精确度(53 位的假数)。

==========================

● 22B:其它环境下的琐事

==========================

Q134:有任何 TeX 或 LaTeX 的宏,能处理 "C++" 的留白效果(spacing)吗?

有的,底下列出两个:

\def\CC{C\raise.22ex\hbox{{\footnotesize +}}\raise.22ex\hbox{\footnotesize +}}

\def\CC{{C\hspace{-.05em}\raisebox{.4ex}{\tiny\bf ++}}}

========================================

Q135:在哪儿可拿到 C++2LaTeX 这个 C++原始码的 LaTeX 美编工具(pretty

printer)?

这儿列出一些 ftp 地点:

Host aix370.rrz.uni-koeln.de (134.95.80.1) Last updated 15:41 26 Apr 1991

Location: /tex

FILE rw-rw-r-- 59855 May 5 1990 C++2LaTeX-1.1.tar.Z

Host utsun.s.u-tokyo.ac.jp (133.11.11.11) Last updated 05:06 20 Apr 1991

Location: /TeX/macros

FILE rw-r--r-- 59855 Mar 4 08:16 C++2LaTeX-1.1.tar.Z

Host nuri.inria.fr (128.93.1.26) Last updated 05:23 9 Apr 1991

Location: /TeX/tools

FILE rw-rw-r-- 59855 Oct 23 16:05 C++2LaTeX-1.1.tar.Z

Host iamsun.unibe.ch (130.92.64.10) Last updated 05:06 4 Apr 1991

Location: /TeX

FILE rw-r--r-- 59855 Apr 25 1990 C++2LaTeX-1.1.tar.Z

Host iamsun.unibe.ch (130.92.64.10) Last updated 05:06 4 Apr 1991

Location: /TeX

FILE rw-r--r-- 51737 Apr 30 1990

C++2LaTeX-1.1-PL1.tar.Z

Host tupac-amaru.informatik.rwth-aachen.de (192.35.229.9)

Last updated 05:07 18 Apr 1991

Location: /pub/textproc/TeX

FILE rw-r--r-- 72957 Oct 25 13:51 C++2LaTeX-1.1-PL4.tar.Z

Host wuarchive.wustl.edu (128.252.135.4) Last updated 23:25 30 Apr 1991

Location: /packages/tex/tex/192.35.229.9/textproc/TeX

FILE rw-rw-r-- 49104 Apr 10 1990 C++2LaTeX-PL2.tar.Z

FILE rw-rw-r-- 25835 Apr 10 1990 C++2LaTeX.tar.Z

Host tupac-amaru.informatik.rwth-aachen.de (192.35.229.9)

Last updated 05:07 18 Apr 1991

Location: /pub/textproc/TeX

FILE rw-r--r-- 74015 Mar 22 16:23 C++2LaTeX-1.1-PL5.tar.Z

Location: /pub

FILE rw-r--r-- 74015 Mar 22 16:23 C++2LaTeX-1.1-PL5.tar.Z

Host sol.cs.ruu.nl (131.211.80.5) Last updated 05:10 15 Apr 1991

Location: /TEX/TOOLS

FILE rw-r--r-- 74015 Apr 4 21:02x C++2LaTeX-1.1-PL5.tar.Z

Host tupac-amaru.informatik.rwth-aachen.de (192.35.229.9)

Last updated 05:07 18 Apr 1991

Location: /pub/textproc/TeX

FILE rw-r--r-- 4792 Sep 11 1990 C++2LaTeX-1.1-patch#1

FILE rw-r--r-- 2385 Sep 11 1990 C++2LaTeX-1.1-patch#2

FILE rw-r--r-- 5069 Sep 11 1990 C++2LaTeX-1.1-patch#3

FILE rw-r--r-- 1587 Oct 25 13:58 C++2LaTeX-1.1-patch#4

FILE rw-r--r-- 8869 Mar 22 16:23 C++2LaTeX-1.1-patch#5

FILE rw-r--r-- 1869 Mar 22 16:23 C++2LaTeX.README

Host rusmv1.rus.uni-stuttgart.de (129.69.1.12)

Last updated 05:13 13 Apr 1991

Location: /soft/tex/utilities

FILE rw-rw-r-- 163840 Jul 16 1990 C++2LaTeX-1.1.tar

========================================

Q136:该到哪里取得 "tgrind" 这个 C++/C/etc 的原始码美编工具?

"tgrind" 读入 C++ 源文件,并输出能让 Unix 打印机印出美观文件的东西。它常

会伴随在 TeX 和 LaTeX 的套件里;请找找这个目录:

"...tex82/contrib/van/tgrind" 。 由 Jerry Leichter 所做更新的版本,可在

venus.ycc.yale.edu in [.TGRIND] 里找到。

========================================

Q137:有给 GNU emacs 编辑器用的 C++-mode 吗?有的话,该怎么拿?

Yes,有一个给 GNU emacs 用的 C++-mode。

最新﹑最好的 C++-mode(以及 c-mode)版本是 cc-mode.el 檔,是 Detlef &

Clamen 版本的延伸。Emacs 里头有一个了,较新的则在 elisp 里面。

========================================

Q138:我要到哪儿得到和操作系统相关的 FAQs( 譬如:BC++﹑DOS﹑Windows 等等

)?

请参考:

* comp.os.msdos.programmer

* comp.windows.ms.programmer

* comp.unix.programmer

[如果您有 BC++、VC++ 的 email address,或是 Semantic C++ 的臭虫清单或可供

讨论的 mailing list,请告诉我该如何加入,我会在这儿提出的。]

========================================

Q139:为什么我的 DOS C++ 程序说 "Sorry: floating point code not linked"

“抱歉,浮点运算程序代码未连结进来”?

编译器会试着节省执行档的大小,所以除非必要,否则不引入浮点数→字符串格式转换

的子程序,可是有时候它会猜错,就会产生上述的错误讯息了。解决法:(1) 使用

<iostream.h> 而不要用 <stdio.h>,或是 (2) 在您程序的某个地方,置入如下的函

数(但是不要真的去呼叫它!):

static void dummyfloat(float *x) { float y; dummyfloat(&y); }

请参考关于 stream I/O 的 FAQ项目,有提到更多使用 <iostream.h> vs <stdio.h>

的理由。

========================================

Q140:为什么当我没执行 BC45 IDE 的话,BC++ 做出来的 Windows 应用程序就不能

用?

用 BC++ 写 Windows 应用程序,如果当 BC45 IDE 正在执行时,你的程序很正常;

待会儿当 BC45 IDE 关掉了,而你的程序却在建立窗口时产生了个 exception 的话

,就把底下这行程序加到你的应用程序类别 ("YourApp::InitMainWindow()") 里头

的 InitMainWindow() 内:

EnableBWCC(TRUE);

【译注】这是因为你用 BC++ 写的应用程序,可能会自动用到 bwcc*.dll,刚好

BC++ 的 IDE 也会用到它,所以两者并存的话,BWCC 已先被 IDE 加载了。

若是 IDE 未执行,则 BWCC 未被加载,你就得用上面那一行程序来通知

OWL 去加载它。

== comp.lang.c++ FAQ 结束 =========================

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有