分享
 
 
 

C++语言常见问题解答(4)

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

==Part4/4============================

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

■□第17节:和C连结/和C的关系

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

Q105:怎样从C++中呼叫C的函数"f(int,char,float)"?

告诉C++编译器说:它是个C的函数:

extern"C"voidf(int,char,float);

确定你有include进来完整的函数原型(functionprototype)。一堆C的函数可

以用大括号框起来,如下:

extern"C"{

void*malloc(size_t);

char*strcpy(char*dest,constchar*src);

intprintf(constchar*fmt,...);

}

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

Q106:怎样才能建一个C++函数"f(int,char,float)",又能被C呼叫?

想让C++编译器知道"f(int,char,float)"会被C编译器用到的话,就要用到前

一则FAQ已详述的"externC"语法。接著在C++模组内定义该函数:

voidf(intx,chary,floatz)

{

//...

}

"externC"一行会告诉编译器:送到linker的外部资讯要采用C的呼叫惯例及签

名编码法(譬如,前置一个底线)。既然C没有多载名称的能力,你就不能让C程

式能同时呼叫得到多载的函数群。

警告以及实作相关事项:

*你的"main()"应该用C++编译之(为了静态物件的初始化)。

*你的C++编译器应该能设定连结的程序(为某些特殊的程式库)。

*你的C和C++编译器可能要是同一个牌子的,而且是相容的版本(亦即:有相

同的呼叫惯例等等)。

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

Q107:为什麽linker有这种错误讯息:C/C++函数被C/C++函数呼叫到?

看前两则FAQs关於extern"C"的使用。

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

Q108:该怎麽把C++类别的物件传给/传自C的函数?

例子:

/******C/C++headerfile:Fred.h******/

#ifdef__cplusplus/*"__cplusplus"is#definedif/only-if

compilerisC++*/

extern"C"{

#endif

#ifdef__STDC__

externvoidc_fn(structFred*);/*ANSI-Cprototypes*/

externstructFred*cplusplus_callback_fn(structFred*);

#else

externvoidc_fn();/*K&Rstyle*/

externstructFred*cplusplus_callback_fn();

#endif

#ifdef__cplusplus

}

#endif

#ifdef__cplusplus

classFred{

public:

Fred();

voidwilma(int);

private:

inta_;

};

#endif

"Fred.C"是个C++模组:

#include"Fred.h"

Fred::Fred():a_(0){}

voidFred::wilma(inta):a_(a){}

Fred*cplusplus_callback_fn(Fred*fred)

{

fred->wilma(123);

returnfred;

}

"main.C"是个C++模组:

#include"Fred.h"

intmain()

{

Fredfred;

c_fn(&fred);

return0;

}

"c-fn.c"是个C模组:

#include"Fred.h"

voidc_fn(structFred*fred)

{

cplusplus_callback_fn(fred);

}

把指向C++物件的指标传到/传自C的函数,如果传出与收回的指标不是“完全相

同”的话,就会失败。譬如,不要传出一个基底类别的指标却收回一个衍生类别的指

标,因为C编译器不懂该怎麽对多重及虚拟继承的指标做转型。

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

Q109:C的函数能不能存取C++类别的物件资料?

有时可以。

(请先读一读前一则关於和C函数间传递C++物件的FAQ。)

你可以安全地从C函数中存取C++物件的资料,只要C++的物件类别:

*没有虚拟函数(包含继承下来的虚拟函数).

*所有资料都在同一个存取等级中(private/protected/public).

*完全被包含的子物件中也都没有虚拟函数.

如果C++类别有任何基底类别(或是任何被完全包含的子物件中有基底类别)的话

,技术上来说,存取该资料没有可携性的,因为语言没规定在继承之下的类别配置是

什麽样子。不过经验上,所有C++编译器的做法都一样:基底类别物件先出现(在

多重继承之下,则由左到右排列之),子物件次之。

还有,如果类别(或是任何基底类别)含有任何虚拟函数,你时常可以(但不是一直

都可以)假设有一个"void*"出现在物件第一个虚拟函数之所在,或是在该物件的

第一个word那里。同样的,语言对它也没规定到,但这似乎是「大家」都采取的做

法。

如果该类别有任何虚拟基底类别,情况会更复杂而且更没有可携性。常见的做法是:

让物件最後才包含基底类别之物件(V)(不管"V"在继承阶层中在哪儿出现),物

件的其他部份则以正常的次序出现。每个有V这个虚拟基底类别的衍生类别,实际

上都有个“指标”指向最後一个物件的V的部份。

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

Q110:为什麽我总觉得C++让我「离机器更远了」,不像C那样?

因为事实上正是如此。

做为一个OOPL,C++让你以该问题的领域来思考,让你以问题领域的语言来设计程

式,而非以解题的领域来著手。

一个C最强的地方是:它没有「隐藏的机制」:你看到的就是你得到的,你可以一

边阅读C的程式,一边「看到」每个系统时脉。C++则不然;C的老手(像从前的

我们)对这种特性常会有矛盾的心理(或是说「敌视」),但是很快的他们会发现:

C++提供了抽象化的层次及经济的表现能力,大大降低维护成本,又不会损及执行效

率。

很自然的,用任何语言都会写出坏程式;C++并不会确保任何高品质、可重用性、抽

象化,或是任何「正字标记」的品质因子。C++不会让差劲的程式者写不出差劲的程

式;她只是协助明智的发展者做出高人一等的软体。

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

■□第18节:指向成员函数的指标

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

Q111:「指向成员函数的指标」和「指到函数的指标」的型态有差别吗?

是的。

考虑底下的函数:

intf(chara,floatb);

如果它是普通的函数,它的型态是:int(*)(char,float);

如果它是Fred类别的运作行为,它的型态是:int(Fred::*)(char,float);

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

Q112:怎样把指向成员函数的指标传给signalhandler、Xeventcallback等等?

【译注】这是和UNIX、XWindowSystem相关的问题,但其他系统亦可推而广之。

不要这样做。

因为若无物件去启动它,成员函数是无意义的,你不能直接使用它(如果X视窗系

统是用C++写的话,或许就可以直接传物件的参考值了,而不光是传个指向函数的

指标;自然地,物件会包含所有要用到的函数,甚至更多)。

若想修改现有的软体,可拿最顶层的(非成员的)函数当作一层包装(wrapper),透

过其他技巧(或许是放在全域变数中),把该物件包起来。这个最顶层的函数,会透

过适当的成员函数去使用该全域变数。

譬如,你想在中断处理中呼叫Fred::memfn()的话:

classFred{

public:

voidmemfn();

staticvoidstaticmemfn();//用个static成员函数就行了

//...

};

//wrapper函数会记得哪个物件该去启动全域物件的成员函数:

Fred*object_which_will_handle_signal;

voidFred_memfn_wrapper(){object_which_will_handle_signal->memfn();}

main()

{

/*signal(SIGINT,Fred::memfn);*///不能这样做

signal(SIGINT,Fred_memfn_wrapper);//Ok

signal(SIGINT,Fred::staticmemfn);//AlsoOk

}

注意:静态成员函数不需要真正的物件才能启动,所以指向静态成员函数的指标,和

普通的指向函数的指标,具有相容的型态(详见ARM["AnnotatedReference

Manual"]p.25,158)。

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

Q113:当我想以成员函数做为中断服务常式(ISR)时,为什麽编译器产生(型态不

符)的错误?

这是前两个问题的特例,所以请先看看前两则解答。

非静态的成员函数,都有一个隐藏的参数,对应到'this'指标,该'this'指标会

指向该物件的案例资料(instancedata),可是系统中断的硬体/韧体并未提供这个

'this'参数。你得用「正常的」函数(不是类别的成员)或是静态成员函数来做为

中断服务常式才行。

一个可行的解法是:用一个静态成员做为中断服务常式,让它能自己到某处去找案例

/成员的配对,以供中断呼叫之用。这麽一来,当中断产生时,正常的method就会

被启动,不过以技术观点来看,你得先呼叫一个中介函数。

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

Q114:为什麽我取不出C++函数的位址?

这可由前一则FAQ推论过来。

详细的解答:在C++里,成员函数有一个隐含的参数,指向该物件本身(成员函数

内的"this"指标)。正常的C函数与成员函数的呼叫惯例可视为不同,所以它们

指标的型态(指向成员函数vs指向函数)既不同也不相容。C++引进一个新的指标

型态:指向成员的指标,要提供一个物件才能启动之(见ARM["Annotated

ReferenceManual"]5.5)。

注意:不要去把指向成员函数的指标强制转型成指向函数的指标;这样做的结果是未

定义的,且下场可能会很惨。譬如,指向成员函数的指标,“不必然”会包含某正常

函数的机器位址(看ARM,8.1.2c,p.158)。如前例所提,如果你有个指向正常C

函数的指标的话,请用上层的(非成员的)函数,或是用"static"成员函数(类别

成员函数)。

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

Q115:怎样宣告指向成员函数的指标阵列?

用"typedef"好让你的脑筋保持清醒。

classFred{

public:

intf(charx,floaty);

intg(charx,floaty);

inth(charx,floaty);

inti(charx,floaty);

//...

};

typedefint(Fred::*FredPtr)(charx,floaty);

这是指向成员函数的指标阵列:Here'sthearrayofpointerstomemberfunctions:

FredPtra[4]={&Fred::f,&Fred::g,&Fred::h,&Fred::i};

呼叫物件"fred"的某一个成员函数:

voiduserCode(Fred&fred,intmethodNum,charx,floaty)

{

//假设"methodNum"在[0,3]区间内

(fred.*a[methodNum])(x,y);

}

你可以用#define让这个呼叫清楚些:

#definecallMethod(object,ptrToMethod)((object).*(ptrToMethod))

callMethod(fred,a[methodNum])(x,y);

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

■□第19节:容器类别与template

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

Q116:怎样自一个连结串列/杂凑表等等里面,插入/存取/改变元素?

我将以最简单的「插入连结串列」为例。想把元素插入串列的头尾很容易,但只限

於这些功能的话,会使程式库过於低能(太低能的程式库比没有更糟)。

完整的解答会让C++新手消化不良,所以我只提几个项目。第一个是最简单的,第

二和第三是比较好的。

[1]替"List"加入一个「现在位置」的性质,加入像是advance()、backup()、

atEnd()、atBegin()、getCurrElem()、setCurrElem(Elem)、insertElem(Elem)

、removeElem()等等的运作行为。

即使在这个小例子里已经够用了,但「只有一个」现在位置的记号的话,想存取

串列中两个以上位置的元素就不太容易(譬如:「对所有x,y序对,做底下的

事情……」)。

[2]把上述的List运作行为拿掉,移到独立的类别"ListPosition"中。

ListPosition的作用是:代表List里「现在的位置」,这样就允许许多位置

并存於同一个串列中。ListPosition是List的夥伴,所以List的内部可对

外界隐藏起来(否则List的内部就会被它的公共运作行为所公开)。注意:

ListPosition可以把运算子多载起来,像是advance()、backup(),因为运算

子多载只是正常运作行为的语法糖衣而已。

[3]把整个位置处理(iteration)当成是一个基元事件(atomicevent),建一个

classtemplate去涵盖该事件。

它不会在内部回圈中使用公共存取运作行为(它有可能是虚拟函数),所以效率

能增进。不幸的,你的应用软体会多出些额外的二元码,因为template是以空

间换取时间的。欲知详情,请见[Koenig,"Templatesasinterfaces,"

JOOP,4,5(Sept91)],以及[Stroustrup,"TheC++ProgrammingLanguage

SecondEdition,"under"Comparator"].

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

Q117:「样版」(template)的用意是什麽?

Template本意是个压饼模子,它把饼乾都压成差不多一个样子(虽然饼乾的原料不

尽相同,但它们都有相同的基本外形)。同理,classtemplate是个样版模子,用

来描述如何将一系列的物件类别弄成同一个基本型式;而functiontemplate则是

用以描述一系列看起来差不多的函数。

Classtemplate常用於制造型别安全的容器(即使这仅止於「如何使用它」而已)。

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

Q118:"functiontemplate"的语法/语意是什麽?

考虑底下这个交换两个整数引数的函数:

voidswap(int&x,int&y)

{

inttmp=x;

x=y;

y=tmp;

}

假如我们想交换float、long、String、Set和FileSystems,我们还得写那些

大致看起来都一样、只有型态不同的程式码,有够烦人。这种不花脑筋的重复性工作

,正是电脑的专长,於是我们想出了functiontemplate:

template

voidswap(T&x,T&y)

{

Ttmp=x;

x=y;

y=tmp;

}

每次我们以一组型别来使用"swap()",编译器会找到上面这定义,并造出另一个

"templatefunction",来当作它的「案例」(instantiation)。譬如:

main()

{

inti,j;/*...*/swap(i,j);//案例化"int"的swap

floata,b;/*...*/swap(a,b);//案例化"float"的swap

charc,d;/*...*/swap(c,d);//案例化"char"的swap

Strings,t;/*...*/swap(s,t);//案例化"String"的swap

}

(注意:"templatefunction"是"functiontemplate"实体化之後的案例。)

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

Q119:"classtemplate"的语法/语意是什麽?

考虑像是个整数阵列的容器类别:

//这会放在像是"Array.h"的标头档中

classArray{

public:

Array(intlen=10):len_(len),data_(newint[len]){}

~Array(){delete[]data_;}

intlen()const{returnlen_;}

constint&operator[](inti)const{data_[check(i)];}

int&operator[](inti){data_[check(i)];}

Array(constArray&);

Array&operator=(constArray&);

private:

intlen_;

int*data_;

intcheck(inti)const

{if(i<0||i>=len_)throwBoundsViol("Array",i,len_);

returni;}

};

如同前述的"swap()",一再为float、char、String、Array-of-String等等来重

复设计Array类别,是很烦人的。

//这会放在像是"Array.h"的标头档中

template

classArray{

public:

Array(intlen=10):len_(len),data_(newT[len]){}

~Array(){delete[]data_;}

intlen()const{returnlen_;}

constT&operator[](inti)const{data_[check(i)];}

T&operator[](inti){data_[check(i)];}

Array(constArray&);

Array&operator=(constArray&);

private:

intlen_;

T*data_;

intcheck(inti)const

{if(i<0||i>=len_)throwBoundsViol("Array",i,len_);

returni;}

};

不像templatefunction那样,templateclasses(案例化的classtemplate)必

须将那些用来案例化的参数型态明示出来:

main()

{

Arrayai;

Arrayaf;

Arrayac;

Arrayas;

Array<Array>aai;

}//^^^--注意这空格;不要用"Array>" //(编译器会把">>"看成单一的元素) ======================================== Q120:什麽是「参数化型别」(parameterizedtype)? 另一种"classtemplate"的说法。 「参数化型别」是一种型别,它被另一个型别或数值所参数化(parameterized)了。 像List是一个型别("List"),它被另一个型别("int")所参数化。 ======================================== Q121:「泛型」(genericity)是什麽? 另一种"classtemplate"的说法。 不要和「一般化」(generality,指不要过於特定的解题)弄混了,「泛型」指的是 classtemplate。 ======================= ■□第20节:程式库 ======================= Q122:怎样拿到"STL"? "STL"代表"StandardTemplatesLibrary",标准模版程式库。取得法: STLHPofficialsite:ftp://butler.hpl.hp.com/stl STLcodealternate:ftp://ftp.cs.rpi.edu/stl STLcode+examples:http://www.cs.rpi.edu/~musser/stl.html STLhacksforGCC-2.6.3已经在GNUlibg++2.6.2.1或更新版本里了(可能较早 的版本也有)。多谢MikeLindner。 ======================================== Q123:怎样ftp到"NumericalRecipes"附的程式? 它是用卖的,把它放到网路上散布是违法的。不过它只需$30美元而已。 ======================================== Q124:为什麽我的执行档会这麽大? 很多人对这麽大的执行档感到惊讶,特别是当原始码只有一点点而已。例如一个简单 的"helloworld"程式居然会产生大家都想不到的大小(40+Kbytes)。 一个原因是:有些C++执行期程式库被连结进去了。有多少被连结进去,就要看看 你用到多少,以及编译器把程式库切割成多少块而定。例如,iostream很大,包含 一大堆类别及虚拟函数,即使你只用到一点点,因为各元件之间的交互参考依存关系 ,可能会把整个iostream程式码都塞进来了。(【译注】如果linker做得好的话 ,应该能把完全用不到的元件objectcode砍掉,不随之塞入你的执行档中。) 不要用静态的,改用动态连结的程式库版本,就可以使你的程式变小。 欲知详情,请看看你的编译器手册,或是寻求厂商的技术支援。 =============================== ■□第21节:特定系统的细节 =============================== Q125:GNUC++(g++)把小程式造出大大的执行档,为什麽? libg++(g++用到的程式库)可能在编译时带有除错的资讯(-g)。有些机器上,不 带除错资讯地重新编译它,会省下很大的磁碟空间(~1MB;缺点是:不能追踪到 libg++的呼叫)。仅仅"strip"掉执行档,比不上先用-g重新编译,再"strip" 掉a.out档来得有效。 用"sizea.out"来看看执行码的程式与资料区段到底占了多大空间,而不要用 "ls-sa.out"这种包括了符号表格(symboltable)的方式。 ======================================== Q126:有YACC的C++文法吗? JimRoskind是C++的YACC文法作者,它大体上和部份USLcfront2.0所实作 出来的语言相容(没有template、例外、执行期型态识别功能)。这份文法有些地 方和C++有细小而微妙的差别。 它可用anonymousftp到下列地方取得: *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)呼叫末端函数(leaffunction)有无特殊的暂存器存放规定? 5)run-time-type-identification如何配置? 6)当一个例外被throw时,执行期的例外处理系统如何得知哪一个区域物件该被解 构? ======================================= ■□第22节:其他的技术和环境的事项 ======================================= ●22A:其他的技术事项 ======================== Q129:为什麽有static资料成员的物件类别产生了linker错误? Static的资料成员必须外显地在唯一的模组中定义。 ^^^^^^~~~~~~^^^^^^^^ 【译注】这句话要逐字细读。原文是:Staticdatamembersmustbe explicitlydefinedinexactlyonemodule. 譬如: classFred{ public: //... private: staticinti_;//宣告static资料成员"Fred::i_" //... }; Linker会告诉你"Fred::i_isnotdefined(未定义)",除非你在任何一个(且 唯一)原始档中定义(而非宣告)了"Fred::i_": intFred::i_=某个会产生int的运算式; 或是: intFred::i_; 通常我们会在"Fred.C"档中定义"Fred"类别的static资料成员(或"Fred.cpp" 等等你使用的副档名)。 ======================================== Q130:"struct"和"class"关键字差别在哪? struct的成员和基底类别,都是预设为public的,而class则预设为private。 注意:你应该“明显地”把基底类别设为public、private或是protected,而不 要依赖预设值。 除此之外,两者的功能是相等的。 ======================================== Q131:为什麽不能以函数的传回值来多载(overload)它? 如果你同时宣告了"charf()"及"floatf()",编译器会给你个错误讯息,因为 呼叫"f()"会造成模拟两可的情况。 ======================================== Q132:什麽是「持续性」?什麽是「持续性物件」? 一个持续性物件(persistentobject),在创造它的程式执行结束後,仍可存活下来 。它甚至可存活於不同的父程式,存活於磁碟系统、作业系统、甚至於作业系统所处 的硬体上。 持续性物件的困难在於:如何有效地在次储存体中,存放它们的运作行为(method) 及资料位元(以及所有成员物件的资料和运作行为,及它们所有的成员物件、基底类 别……等等)。这一切都得自己来做的话,可不是件容易的事。在C++中,你就得自 己来。C++/OO的资料库系统,会替你把这些机制都隐藏起来。 ======================================== Q133:为什麽浮点数(floatingpoint)这麽不精确?为什麽这段程式不会印出0.43? #include main() { floata=1000.43; floata=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地点: Hostaix370.rrz.uni-koeln.de(134.95.80.1)Lastupdated15:4126Apr1991 Location:/tex FILErw-rw-r--59855May51990C++2LaTeX-1.1.tar.Z Hostutsun.s.u-tokyo.ac.jp(133.11.11.11)Lastupdated05:0620Apr1991 Location:/TeX/macros FILErw-r--r--59855Mar408:16C++2LaTeX-1.1.tar.Z Hostnuri.inria.fr(128.93.1.26)Lastupdated05:239Apr1991 Location:/TeX/tools FILErw-rw-r--59855Oct2316:05C++2LaTeX-1.1.tar.Z Hostiamsun.unibe.ch(130.92.64.10)Lastupdated05:064Apr1991 Location:/TeX FILErw-r--r--59855Apr251990C++2LaTeX-1.1.tar.Z Hostiamsun.unibe.ch(130.92.64.10)Lastupdated05:064Apr1991 Location:/TeX FILErw-r--r--51737Apr301990 C++2LaTeX-1.1-PL1.tar.Z Hosttupac-amaru.informatik.rwth-aachen.de(192.35.229.9) Lastupdated05:0718Apr1991 Location:/pub/textproc/TeX FILErw-r--r--72957Oct2513:51C++2LaTeX-1.1-PL4.tar.Z Hostwuarchive.wustl.edu(128.252.135.4)Lastupdated23:2530Apr1991 Location:/packages/tex/tex/192.35.229.9/textproc/TeX FILErw-rw-r--49104Apr101990C++2LaTeX-PL2.tar.Z FILErw-rw-r--25835Apr101990C++2LaTeX.tar.Z Hosttupac-amaru.informatik.rwth-aachen.de(192.35.229.9) Lastupdated05:0718Apr1991 Location:/pub/textproc/TeX FILErw-r--r--74015Mar2216:23C++2LaTeX-1.1-PL5.tar.Z Location:/pub FILErw-r--r--74015Mar2216:23C++2LaTeX-1.1-PL5.tar.Z Hostsol.cs.ruu.nl(131.211.80.5)Lastupdated05:1015Apr1991 Location:/TEX/TOOLS FILErw-r--r--74015Apr421:02xC++2LaTeX-1.1-PL5.tar.Z Hosttupac-amaru.informatik.rwth-aachen.de(192.35.229.9) Lastupdated05:0718Apr1991 Location:/pub/textproc/TeX FILErw-r--r--4792Sep111990C++2LaTeX-1.1-patch#1 FILErw-r--r--2385Sep111990C++2LaTeX-1.1-patch#2 FILErw-r--r--5069Sep111990C++2LaTeX-1.1-patch#3 FILErw-r--r--1587Oct2513:58C++2LaTeX-1.1-patch#4 FILErw-r--r--8869Mar2216:23C++2LaTeX-1.1-patch#5 FILErw-r--r--1869Mar2216:23C++2LaTeX.README Hostrusmv1.rus.uni-stuttgart.de(129.69.1.12) Lastupdated05:1313Apr1991 Location:/soft/tex/utilities FILErw-rw-r--163840Jul161990C++2LaTeX-1.1.tar ======================================== Q136:该到哪里取得"tgrind"这个C++/C/etc的原始码美编工具? "tgrind"读入C++原始档案,并输出能让Unix印表机印出美观文件的东西。它常 会伴随在TeX和LaTeX的套件里;请找找这个目录: "...tex82/contrib/van/tgrind"。由JerryLeichter所做更新的版本,可在 venus.ycc.yale.eduin[.TGRIND]里找到。 ======================================== Q137:有给GNUemacs编辑器用的C++-mode吗?有的话,该怎麽拿? Yes,有一个给GNUemacs用的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++的emailaddress,或是SemanticC++的臭□清单或可供 讨论的mailinglist,请告诉我该如何加入,我会在这儿提出的。] ======================================== Q139:为什麽我的DOSC++程式说"Sorry:floatingpointcodenotlinked" “抱歉,浮点运算程式码未连结进来”? 编译器会试著节省执行档的大小,所以除非必要,否则不引入浮点数→字串格式转换 的副程式,可是有时候它会猜错,就会产生上述的错误讯息了。解决法:(1)使用 而不要用,或是(2)在您程式的某个地方,置入如下的函 数(但是不要真的去呼叫它!): staticvoiddummyfloat(float*x){floaty;dummyfloat(&y);} 请参考关於streamI/O的FAQ项目,有提到更多使用vs 的理由。 ======================================== Q140:为什麽当我没执行BC45IDE的话,BC++做出来的Windows应用程式就不能 用? 用BC++写Windows应用程式,如果当BC45IDE正在执行时,你的程式很正常; 待会儿当BC45IDE关掉了,而你的程式却在建立视窗时产生了个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- 王朝網路 版權所有