随笔分类 - C++
摘要:0. 引言C++中的句法歧义主要由类似int (a)的代码引起,此类代码共有3种合法的结构解释: 第一种是声明符a两边具有冗余圆括号的对象声明,其等同于int a; 第二种是函数式转型,它是表达式的一种,其等同于(int) a; 第三种是函数类型标识符,其等同于int f(a b)。 既然一种代码可同时解释为声明、表达式和类型,根据排列组合,共可引发声明和表达式、声明和类型、表达式和类型之间的3类歧义,这3类歧义均无法通过句法消解。上述3类两两之间的歧义在C++中都存在对应的句法构造,所幸的是C++中不存在声明、表达式和类型都能同时存在的地方,否则将需要消解3个对象,而不是现在的2个。下面对3
阅读全文
摘要:1、libcpp中和宏相关的基础知识libcpp是gcc的C/C++语言预处理器,gcc将C/C++语言预处理器cpp以库的形式独立出来,故取名曰libcpp。libcpp的输出为预处理标记cpp_token序列,为了实现回退机制、预处理指令处理和宏扩展,libcpp分三层输出预处理标记cpp_token序列:a)_cpp_lex_direct:这是预处理标记序列输出的第一层,它直接对程序文件进行词法分析,不处理任何预处理指令,也不提供回退功能,它反映的是真实的程序文本;b)cpp_lex_token:第二层在第一层的基础上实现了回退和预处理指令处理功能,调用这一层的用户看不到符合C/C++标
阅读全文
摘要:5.2.4 伪析构函数调用1、在点号.或箭头->之后的pseudo-destructor-name代表了由type-name命名的非类类型的析构函数。pseudo-destructor-name只能用作函数调用操作符()的操作数,此类调用的结果为空类型,它的唯一作用在于计算点号或箭头前面的后缀表达式。例如: typedef int I; I x = 10; x.I::~I(); // or x.~I(); x = 20;上面的x.I::~I();语句其实是调用了int类型的析构函数,但这并不会销毁x对象,x对象还能正常使用,x.I::~I();在此处并无实质作用。另外,如果将x.I::~
阅读全文
摘要:函数定义或声明时叫参数(parameter),函数调用时则称参量(argument)。如:int f(int a);main(){ int i = 0; f(i);}其中i称为参量,a称为参数。参量通常称为实参(actual argument),参数则称为形参(formal parameter)。
阅读全文
摘要:在C++语言中,我们是应该存储对象本身还是对象的指针呢?储存指针就一定比对象本身节约空间和高效吗?最近在做一个程序,程序要求访问大量的字符串,在程序中每个相同的字符串只有一个唯一的副本。我构造了一个类KCStringManager,其中的方法LPCTSTR GetString(LPCTSTR lpszName)用于返回储存在Hash表中的字符串指针,这个字符串等于lpszName,由此保证每个字符串指针的唯一性。这样带来的好处是:首先节省了空间;其次,后期字符串的比较工作非常高效,只需要比较它们的指针是否指向同一个地址。这正是很多编译器所使用的方法。另外,我还构造了一个KSymbol类,其中包
阅读全文
摘要:在C语言中,经常有如下的用法:typedef struct tag{ ...} MyType, *MyPtr;一旦通过如上定以后,就可以用MyType来定义struct tag结构了。以前我使用typedef的时候,是按照其字面意思理解的,所以进入了一个误区。比如说我想定义MyInt为int类型,我用的代码如下:typedef MyInt int;我把上述代码理解为:定义MyInt类型为int。一切好像都是顺其自然的事情,但编译的时候才知道错误。其实,在C语言中声明变量的时候,有个存储类型指示符(storage-class-specifier),它包括我们熟悉的externstaticauto
阅读全文
摘要:在C++中重载new和delete操作符可以给程序带来更灵活的存储控制,对于游戏设计等对效率要求较高的应用而言是必不可少的。一般的C++书籍中也会介绍它们的应用和实现,然而在VC中实现却有几个必须注意的地方,否则编译会出现问题。1. 实现首先,vc在每个自动生成的cpp文件中都会加入如下代码:#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif从上面红色的字体可以看出,这时的new在debug模式下被定义成了DEBUG_NEW,所以实现new函数的代码应该放在此定义之前
阅读全文
摘要:以前在windows下总喜欢使用CFile类来操作文件,最近改用fopen系列函数,却没想到一个不经意的问题让我调试了一整天。打开文件使用的代码如下:FILE* fh = fopen("c:/filename", "r");缺省情况下(当然可以进行设置),文件是以文本模式打开的,因为我们没有使用b标记。这个时候,如果文件数据中含有0x1a就有麻烦了。每当读到0x1a的时候,文件的位置会跳到4096(ftell返回的结果),如果文件小于4096字节的话,那么调用fgetc得到的结果是EOF。另外,ftell返回的结果也和文件的物理位置不一致,这使得我们在不
阅读全文
浙公网安备 33010602011771号