在使用兼容C89标准(也称为ANSI C)的编译器时,下面这个程序显示“Hello, world!”然后结束运行:
#include <stdio.h>
int main(void) //在c++中不应该有这个void
{
printf("Hello, world!\");
return 0;
}
(以上是c语言代码,c++语言是c语言的包集,所以这个程序可以运行,但更应该像下面这样)
在使用比较老的编译器时,下面的程序也是可以的:
#include <iostream.h>
using namespace std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
在使用兼容C++ 98标准的编译器时,应当是:
#include <iostream>
int main()
{
std::cout<<"Hello,world!"<<std::endl;
return 0;
}
根据ISO C++的规定,main函数的形式只能是
int main()
{
...
}
以及
int main(int argc,char * argv[])
{
...
}
尽管如此,但在Visual C++ 2003以前的Microsoft Visual Studio编译器上,
void main()
{
...
}
也被支持,但这并不正确,也不标准。这样的写法会使程序代码丧失跨平台的特性。每年都有专业人士规定C++的语法,这也是C++优于其他编程语言的原因之一,由它衍生的Java已成为通用编程语言中广受欢迎的一种。
人们一般认为,使用Java或C#的开发成本比C++低。但是,如果你能够充分分析C++和这些语言的差别,会发现这句话的成立是有条件的。这个条件就是:软件规模和复杂度都比较小。如果不超过3万行有效代码(不包括生成器产生的代码),这句话基本上还能成立。否则,随着代码量和复杂度的增加,C++的优势将会越来越明显。造成这种差别的就是C++的软件工程性。
在使用兼容C89标准(也称为ANSI C)的编译器时,下面这个程序显示“Hello, world!”然后结束运行:
# include <iostream>
int main()
{
std::cout << "Hello, world!" << std::endl;
return 0;
}
在使用兼容C99标准(ISO/IEC 14882-1998)的编译器时,下面的程序也是可以的:
# include <iostream>
using namespace std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
根据ISO C++的规定,main函数的形式只能是
int main()
{
/* ... */
}
以及
int main(int argc, char * argv[])
{
/* ... */
}
尽管如此,但在大部分编译器(例如Visual C++编译器)上,
/* 永远不要这么写 */
void main()
{
/* ... */
}
也被支持。
使用new和delete进行动态内存分配和释放 运算符new和delete提供了存储的动态分配和释放功能。它的作用相当于C语言的函数malloc()和free(),但是性能更为优越。使用new较之使用malloc()有以下的几个优点:
(1)new自动计算要分配类型的大小,不使用sizeof运算符,比较省事,可以避免错误。
(2)自动地返回正确的指针类型,不用进行强制指针类型转换。
(3)可以用new对分配的对象进行初始化。
使用例子:
(1)int* p;
p=new int[10]; //分配一个含有10个整数的整型数组
delete[] p; //释放这个指向数组的指针所占内存
(2)int* p;
p=new int (100);//动态分配一个整数并初始化
对于频繁使用的函数,C语言建议使用宏调用代替函数调用以加快代码执行,减少调用开销。但是宏调用有许多的弊端,可能引起不期望的副作用。例如宏:#define abs(a)(a)<0?(-a):(a)),当使用abs(i++)时,这个宏就会出错。
所以在C++中应该使用inline内联函数替代宏调用,这样既可达到宏调用的目的,又避免了宏调用的弊端。
使用内联函数只须把inline关键字放在函数返回类型的前面。例如:
inline int Add(int a,int b);//声明Add()为内联函数
这样编译器在遇到Add()函数时,就不再进行函数调用,而是直接嵌入函数代码以加快程序的执行。
在C语言中,两个函数的名称不能相同,否则会导致编译错误。而在C++中,函数名相同而参数数据类型不同的两个函数被解释为重载。例如:
void PutHz(char* str);//在当前位置输出汉字
void PutHz(int x,?int y,?char * str);//在x,y处输入数字
使用函数重载可以帮助程序员处理更多的复杂问题,避免了使用诸如intabs()、fabs()、dabs()等繁杂的函数名称;同时在大型程序中,使函数名易于管理和使用,而不必绞尽脑汁地去处理函数名。同时必须注意,参数数据类型相同,但是函数返回类型不同的两个函数不能重载。
在C语言中,如果一个函数需要修改用作参数的变量值的时候 ,参数应该声明为指针类型。例如:
void Add(int *a)
{
(*a)++;
}
调用时则使用
Add(&x); //其中x为int或可以转化为int的类型,如unsigned int, 但这时候编译器通常会给出warning
对于复杂的程序,使用指针容易出错,程序也难以读懂。在C++中,对于上述情况 可以使用引用来代替指针,使程序更加清晰易懂。引用就是对变量取的一个别名,对引用进行操作,这就相当于对原有变量进行操作。例如使用引用的函数定义为:
void Add(int& a)
{
a++; //a为一个整数的引用
}
调用时使用
Add(x); //其中x为int
这个函数与使用指针的上一个函数的功能是一样的,然而代码却更为简洁和清晰易懂。
在C++中函数可以使用缺省参数,例如:
void PutHzxy(char *str,int x=-1, int y=-1)
{
if(x==-1)
x=wherex();
if(y==-1)
x=wherex();
moveto(x,y);
PutHx(str);
}
可以有三种方式调用函数PutHzxy(),例如:
PutHzxy("C++语言");//使用缺省参数,在当前位置输出
PutHzxy("C++语言",10,10);//没有使用缺省参数
PutHzxy("C++语言",10);//对y使用缺省参数,指定x的位置
通常的情况下,一个函数应该具有尽可能大的灵活性。使用缺省参数为程序员处理更大的复杂性和灵活性问题提供了有效的方法,所以在C++的代码中都大量地使用了缺省参数。
需要说明的是,所有的缺省参数必须出现在不缺省参数的右边。亦即,一旦开始定义缺省参数,就不可再说明非缺省的参数。否则当你省略其中一个参数的时候,编译器无法知道你是自定义了这个参数还是利用了缺省参数而定义了非缺省的参数。
例如:
void PutHzxy(char*str,int x=-1,int y=-1)//正确
void PutHzxy(int x=-1,int y=-1,char*str)//错误
STL(Standard Template Library,标准模板库), STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),并包括一些工具类如auto_ptr。几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
#include<vector>// 包含相关的头文件/
typedef std::vector<int> intvector;//使用typedef 使代码看起来更简洁
int main()
{
intvector vi;
for(int i=0;i<10,i++)
vi.push_back(i);//使用push_back添加元素
for(int i=0;i<vi.size();i++)
std::cout<<vi[i]<<" ";//[]操作符被重载,使得我们可以像访问数组一样访问vector中的元素
}
在unix世界有大量的程序员是传统的非IDE的方式进行软件开发。一般是如下组合:
1.编译器:gcc,clang等
2.编辑器:一般是vim/emacs
3.make:gnu make 或者bsd 的pmake等,功能与用法基本一样
4.版本管理:cvs,svn,git等
5.代码阅读:cscope,ctags,lxr等
1.Visual Studio(Visual C++)
2.Borland C++ Builder
3.Eclipse(Myln + CDT + Mingw32 + GCC)
4.Dev-C++(Mingw32 + GCC)
5.Code::Blocks(可配合多款编译核心使用)
6.Codelite
7.C-Free
8.Qt Creator等基于Qt开发框架的IDE
如上所示,目前流行的GNU GCC和微软的Visual Studio系列各执一套基本的编译链,其他的IDE都是衍生产品
书名 备注
《The C++ Standard Library: A Tutorial and Reference》
中文版:《C++标准程序库:自修教程与参考手册》 百科全书式的C++标准库著作,一本需要一再查阅的参考大全。本书详细介绍了每一标准库组件的规格和用法,内容涵盖包括流和本地化在内的整个标准库而不仅仅是STL。正如本书副标题所示,它首先适合作为教程阅读,尔后又可用作参考手册。 浅显易懂的写作风格使得这本书非常易读。
《Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference》
中文版《标准C++输入输出流与本地化》
《Effective STL》 在这本书中,Scott讲述了STL容器和算法的工作机制以及如何以最佳方式使用它们。和Scott的其他作品一样,这本书的写作风格清晰、精确,具有极佳的可读性。
影印版《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》
中文版《泛型编程与STL》 这本书散发着浓厚的学院气息。Andrew Koenig和Barbara Moo在《Accelerated C++: Practical Programming by Example》一书末尾郑重推荐另外两本进阶好书(除了他们自己的《Ruminations on C++》外),其中一本是TCPL,另外一本就是本书。
Douglas C. Schmidt, Stephen D. Huston,《C++ Network Programming》
Volume 1: Mastering Complexity with ACE and Patterns;
Volume 2: Systematic Reuse with ACE and Frameworks;
中文版:,《C++网络编程》
卷1:运用ACE和模式消除复杂性
卷2:基于 ACE 和框架的系统化复用 采用C++进行企业级网络编程,ACE(Adaptive Communications Environment)是一个值得考虑的选择,ACE是一个面向对象、跨平台、开放源码的网络编程框架,目标在于构建高性能网络应用和中间件。
Douglas是ACE的创始人,Stephen则已为ACE提供了数年的技术支持和顾问服务,两位都是ACE社群(是的,ACE的影响和实际应用的程度已经形成了一个社群)的专家。
除了使用C++面向对象设计技术和模板等高级语言特性外,ACE还运用了大量的模式。《C++网络编程》卷1和卷2并不仅仅教你关于ACE的方方面面,它还会教给你模式和通用框架设计等高级技术等。
并非所有网络应用都要使用Web服务器(以及其他应用服务器)和重量级组件模型,换个思路,它们或许也可以从轻量级的ACE组件中获益。
Bruce Eckel,《Thinking in C++》影印版二版、三版(又名卷二)
中文《C++编程思想》二版
卷一:标准C++导引
卷二:实用编程技术 《Thinking in C++》的第1版于1996年荣获“软件研发”杂志评选的图书震撼大奖。第2版对内容进行了大幅改写和调整,以反映C++标准化带来的影响以及当时面向对象领域最新研究和实践成果。
“输入输入流”、“多重继承”、“异常处理”和“运行时类型识别”等高级主题连同C++标准化以后增加的一些内容则被放入第二卷中。
Andrew Koenig, Barbara E. Moo,《Ruminations on C++: A Decade of Programming Insight and Experience》
中文版《C++沉思录》 一本关于C++编程思想和程序设计技术而非语言细节的著作。
Bjarne这样评价这本书:本书遍布“C++是什么?C++能够做什么?”的真知灼见。
Stanley B. Lippman,影印版《Inside The C++ Object Model》
中文版《深度探索C++对象模型》 从编译器角度观察C++。本书探讨了大量C++面向对象程序设计的底层运作机制,包括构造函数、函数、临时对象、继承、虚拟、模板的实例化、异常处理、运行期类型识别等,另外还介绍了一些在实现C++对象模型过程中做出的权衡折衷。
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides,《Design Patterns:Elements of Reusable Object-Oriented software》
中文版《设计模式:可复用面向对象软件的基础》 本书并非专为C++程序员而写,但它采用了C++(以及Smalltalk)作为主要示例语言,C++程序员尤其易于从中受益。
John Lakos,《Large-Scale C++ Software Design》
中文版《大规模C++程序设计》
候捷,《STL 源码剖析》
《The C++ Standard : Incorporating Technical Corrigendum No. 1》
C++面向对象程序设计(作者:Walter Savitch)
C++ Primer中文版(第4版) 《C++ Primer中文版(第4版)》对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。第4版不再强调低层编程技术,而把中心转向标准库的使用。书中很早就开始介绍标准库,示例也已经重新改写,充分利用了标准库设施。我们也对语言主题叙述的先后次序进行了重新编排,使讲解更加流畅。
作为目前业界广泛使用的编程语言,C++可谓包罗万象、博大精深。20年来,讲述C++的图书早已经汗牛充栋、层出不穷,但其中业界公认的完整涵盖C++标准的权威著作只有两部,其中一部就是本书!它是业界内久负盛名、无可替代的C++经典著作,它的原版销量超过450000册,它教授最新的编程理念与实践,它是所有C++程序员不可或缺的参考书!
C++ Primer plus(第五版) 本书享有“程序员和开发人员学习C++的完整教程”的美誉,它经过仔细的测试,制作精细,是计算机行业的经典著作。前4版在美国的总销售量超过了10万册。该书阐述了包括结构化代码和自顶向下设计在内的编程原理,涵盖了类、继承、模板、异常以及最新的面向对象编程技术等内容。
英文 参考译文
Ambiguous operators need parentheses 不明确的运算需要用括号括起
Ambiguous symbol ''xxx'' 不明确的符号
Argument list syntax error 参数表语法错误
Array bounds missing 丢失数组界限符
Array size toolarge 数组尺寸太大
Bad character in paramenters 参数中有不适当的字符
Bad file name format in include directive 包含命令中文件名格式不正确
Bad ifdef directive synatax 编译预处理ifdef有语法错
Bad undef directive syntax 编译预处理undef有语法错
Bit field too large 位字段太长
Call of non-function 调用未定义的函数
Call to function with no prototype 调用函数时没有函数的说明
Cannot modify a const object 不允许修改常量对象
Case outside of switch 漏掉了case 语句
Case syntax error Case 语法错误
Code has no effect 代码不可述不可能执行到
Compound statement missing{ 分程序漏掉"{"
Conflicting type modifiers 不明确的类型说明符
Constant expression required 要求常量表达式
Constant out of range in comparison 在比较中常量超出范围
Conversion may lose significant digits 转换时会丢失意义的数字
Conversion of near pointer not allowed 不允许转换近指针
Could not find file ''xxx'' 找不到XXX文件
Declaration missing ; 说明缺少";"
Declaration syntax error 说明中出现语法错误
Default outside of switch Default 出现在switch语句之外
Define directive needs an identifier 定义编译预处理需要标识符
Division by zero 用零作除数
Do statement must have while Do-while语句中缺少while部分
Enum syntax error 枚举类型语法错误
Enumeration constant syntax error 枚举常数语法错误
Error directive :xxx 错误的编译预处理命令
Error writing output file 写输出文件错误
Expression syntax error 表达式语法错误
Extra parameter in call 调用时出现多余错误
File name too long 文件名太长
Function call missing 函数调用缺少右括号
Fuction definition out of place 函数定义位置错误
Fuction should return a value 函数必需返回一个值
Goto statement missing label Goto语句没有标号
Hexadecimal or octal constant too large 16进制或8进制常数太大
Illegal character ''x'' 非法字符x
Illegal initialization 非法的初始化
Illegal octal digit 非法的8进制数字
Illegal pointer subtraction 非法的指针相减
Illegal structure operation 非法的结构体操作
Illegal use of floating point 非法的浮点运算
Illegal use of pointer 指针使用非法
Improper use of a typedefsymbol 类型定义符号使用不恰当
In-line assembly not allowed 不允许使用行间汇编
Incompatible storage class 存储类别不相容
Incompatible type conversion 不相容的类型转换
Incorrect number format 错误的数据格式
Incorrect use of default Default使用不当
Invalid indirection 无效的间接运算
Invalid pointer addition 指针相加无效
Irreducible expression tree 无法执行的表达式运算
Lvalue required 需要逻辑值0或非0值
Macro argument syntax error 宏参数语法错误
Macro expansion too long 宏的扩展以后太长
Mismatched number of parameters in definition 定义中参数个数不匹配
Misplaced break 此处不应出现break语句
Misplaced continue 此处不应出现continue语句
Misplaced decimal point 此处不应出现小数点
Misplaced elif directive 不应编译预处理elif
Misplaced else 此处不应出现else
Misplaced else directive 此处不应出现编译预处理else
Misplaced endif directive 此处不应出现编译预处理endif
Must be addressable 必须是可以编址的
Must take address of memory location 必须存储定位的地址
No declaration for function ''xxx'' 没有函数xxx的说明
No stack 缺少堆栈
No type information/没有类型信息 缺少堆栈
Non-portable pointer assignment 不可移动的指针(地址常数)赋值
Non-portable pointer comparison 不可移动的指针(地址常数)比较
Non-portable pointer conversion 不可移动的指针(地址常数)转换
Not a valid expression format type 不合法的表达式格式
Not an allowed type 不允许使用的类型
Numeric constant too large 数值常太大
Out of memory 内存不够用
Parameter ''xxx'' is never used 能数xxx没有用到
Pointer required on left side of -> 符号->的左边必须是指针
Possible use of ''xxx'' before definition 在定义之前就使用了xxx(警告)
Possibly incorrect assignment 赋值可能不正确
Redeclaration of ''xxx'' 重复定义了xxx
Redefinition of ''xxx'' is not identical xxx的两次定义不一致
Register allocation failure 寄存器定址失败
Repeat count needs an lvalue 重复计数需要逻辑值
Size of structure or array not known 结构体或数给大小不确定
Statement missing ; 语句后缺少";"
Structure or union syntax error 结构体或联合体语法错误
Structure size too large 结构体尺寸太大
Sub scripting missing ] 下标缺少右方括号
Superfluous & with function or array 函数或数组中有多余的"&"
Suspicious pointer conversion 可疑的指针转换
Symbol limit exceeded 符号超限
Too few parameters in call 函数调用时的实参少于函数的参数不
Too many default cases Default太多(switch语句中一个)
Too many error or warning messages 错误或警告信息太多
英文 参考译文
Too many type in declaration 说明中类型太多
Too much auto memory in function 函数用到的局部存储太多
Too much global data defined in file 文件中全局数据太多
Two consecutive dots 两个连续的句点
Type mismatch in parameter xxx 参数xxx类型不匹配
Type mismatch in redeclaration of ''xxx'' xxx重定义的类型不匹配
Unable to create output file ''xxx'' 无法建立输出文件xxx
Unable to open include file ''xxx'' 无法打开被包含的文件xxx
Unable to open input file ''xxx'' 无法打开输入文件xxx
Undefined label ''xxx'' 没有定义的标号xxx
Undefined structure ''xxx'' 没有定义的结构xxx
Undefined symbol ''xxx'' 没有定义的符号xxx
Unexpected end of file in comment started on line xxx 从xxx行开始的注解尚未结束文件不能结束
Unexpected end of file in conditional started on line xxx 从xxx 开始的条件语句 尚未结束文件不能结束
Unknown assemble instruction 未知的汇编结构
Unknown option 未知的操作
Unknown preprocessor directive: ''xxx'' 不认识的预处理命令xxx
Unreachable code 无路可达的代码
Unterminated string or character constant 字符串缺少引号
User break 用户强行中断了程序
Void functions may not return a value Void类型的函数不应有返回值
Wrong number of arguments 调用函数的参数数目错
''xxx'' not an argument xxx不是参数
''xxx'' not part of structure xxx不是结构体的一部分
xxx statement missing ( xxx语句缺少左括号
xxx statement missing ) xxx语句缺少右括号
xxx statement missing ; xxx缺少分号
xxx'' declared but never used 说明了xxx但没有使用
xxx'' is assigned a value which is never used 给xxx赋了值但未用过
Zero length structure 结构体的长度为零
C++在一定程度上可以和C语言很好的结合,甚至目前大多数C语言程序是在C++的集成开发环境中完成的。C++相对众多的面向对象的语言,具有相当高的性能。
C++引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。很多优秀的程序框架包括MFC、QT、wxWidgets就是使用的C++。
C++由于语言本身过度复杂,这甚至使人类难于理解其语义。更为糟糕的是C++的编译系统受到C++的复杂性的影响,非常难于编写,即使能够使用的编译器也存在了大量的问题,这些问题大多难于被发现。
由于本身的复杂性,复杂的C++程序的正确性相当难于保证。也有人提出不支持多线程的原语等缺陷。不过有如此多的知名人士提出了如此多的缺陷,正说明C++被广泛使用和成功。
c++语言由于过度的复杂性,以及与unix的文化相抵触,在unix/linux领域受到很多著名人士(比如Linux之父linus torvalds与著名黑客Eric S. Raymond)的强烈批评与抵制。
参见《unix编程艺术》对c++的批评。
词条 | c++ |
释义 | C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,“CPP”。 它是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。 简史美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)博士在20世纪80年代初期发明并实现了C++(最初这种语言被称作“C with Classes”)。一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、命名空间(name space)逐渐被加入标准。1998年国际标准组织(ISO)颁布了C++程序设计语言的国际标准ISO/IEC 1988-1998。C++是具有国际标准的编程语言,通常称作ANSI/ISOC++。 1998年是C++标准委员会成立的第一年,以后每5年视实际需要更新一次标准。C++0x最终国际投票已于2011年8月10日结束,并且所有国家都投出了赞成票,C++0x已经毫无疑义地成为正式国际标准。先前被临时命名为C++0x的新标准将被称为C++ 2011。C++ 2011将取代现行的C++标准ISO/IEC 14882,它公开于1998年并于2003年更新,通称C++98以及C++03。国际标准化组织于2011年9月1日出版发布ISO/IEC 14882:2011,名称是:Information technology -- Programming languages -- C++ Edition: 3。 组成部分根据Effective C++第三版第一条款的描述,现在C++由以下四个“子语言”组成: 1、C子语言。C++支持C语言的几乎全部功能,主要是c89的部分,在语法上与C语言仅有极微妙的差别(如括号表达式的左右值性,具体请参考C++标准文献)。 2、面向对象的C++语言。C++语言原本不具备面向对象的设计功能,然而随着面向对象编程的概念的提出以及如Java等语言的发展成熟,C++语言也开发出了支持面向对象功能的版本。 3、泛型编程语言。C++强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。 4、STL(C++标准模板库,Standard Template Library)。随着STL的不断发展,它已经逐渐成为C++程序设计中不可或缺的部分,其效率可能比一般的native代码低些,但是其安全性与规范性使它大受欢迎。 此外,包含在TR1等中的C++0x将实现的新功能在开发和测试中。 发展阶段C++语言发展大概可以分为三个阶段: 第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额; 第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击; 第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。 特点· C++设计成静态类型、和C同样高效且可移植的多用途程序设计语言。 · C++设计成直接的和广泛的支援多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。 · C++设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。 · C++设计成尽可能与C兼容,籍此提供一个从C到C++的平滑过渡。 · C++避免平台限定或没有普遍用途的特性。 · C++不使用会带来额外开销的特性。 · C++设计成无需复杂的程序设计环境。 出于保证语言的简洁和运行高效等方面的考虑,C++的很多特性都是以库(如STL)或其他的形式提供的,而没有直接添加到语言本身里。关于此类话题,Bjarne Stroustrup的《C++语言的设计和演化》(1994)里做了详尽的陈述。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。