摘要: 7.1.5.1 cv限定符1、共有两个cv限定符:const和volatile。如果cv限定符出现在decl-specifier-seq中,声明的init-declarator-list部分不能为空。[注:3.9.3讨论了cv限定符是如何影响对象和函数类型的]2、在名字空间作用域中声明的const限定类型对象具有外部链接属性,除非对象是通过extern声明的,或者对象先前已被声明为外部链接。通过整型常量表达式初始化的非volatile但const限定的整型变量或枚举类型可当作整型常量表达式使用(5.19)。[注:如8.5所述, const限定类型的对象或子对象的定义必须包含初始化体,或者此定义 阅读全文
posted @ 2006-04-13 10:01 Goncely 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 7.1.5 类型说明符1、类型说明符包括type-specifier:simple-type-specifierclass-specifierenum-specifierelaborated-type-specifiercv-qualifier一个通用的规则是:在声明的decl-specifier-seq中至多只允许出现一种类型说明符。以下情况例外:——const或者volatile可以和其它类型声明符结合使用。但是,冗余的cv限定符是不允许的,除非是被类型定义(7.1.3)或模板类型参量(14.3)引入,在这种情况下冗余的cv限定符被忽略。——signed和unsigned可以和char,l 阅读全文
posted @ 2006-04-13 10:00 Goncely 阅读(277) 评论(0) 推荐(0) 编辑
摘要: 7.1.3 类型定义说明符1、包含声明说名符typedef的声明声明了一个可在稍后用于命名基本(3.9.1)或复合(3.9.2)类型的标识符。typedef说明符不可用于函数定义(8.4),并且只能和类型说明符结合以构成decl-specifier-seq。typedef-name:identifier通过typedef说明符声明的名字为类型定义名。在声明的作用域内,类型定义名在句法上等价于一个关键字;并且如第8章所示,它命名了标识符所关联的类型。因而,类型定义名总是另一种类型的同义词。与类声明(9.1)和枚举声明不同,类型定义名并不引入新的类型。例如:在typedef int MILES, 阅读全文
posted @ 2006-03-27 16:28 Goncely 阅读(520) 评论(0) 推荐(0) 编辑
摘要: 7.1.2 函数说明符1、函数说明符只能用于函数声明。function-specifier:inlinevirtualexplicit2、具有inline说明符的函数声明(8.3.5,9.3,11.4)声明了一个内联函数。内联说明符指示编译器优先在调用点进行函数体的内联替换,而不是使用常规的函数调用机制。编译器并非一点要在调用点执行内联替换;然而,即使忽略了内联替换,仍必须遵守7.1.2所定义的有关内联函数的其他规则。3、在类定义内部进行的函数定义是内联函数。内联指示符不能出现在区块作用域内的函数声明中。(inline说明符不影响函数的链接属性。)4、内联函数必须在被调用的每一个翻译单元中具有 阅读全文
posted @ 2006-03-27 16:24 Goncely 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 7.1.1 存储类说明符1、存储类说明符包括:storage-class-specifier:autoregisterstaticexternmutable对于给定的decl-specifier-seq,至多只能有一个存储类说明符。如果一个存储类说明符出现在某个decl-specifier-seq中,那么这个decl-specifier-seq可以不包含typedef说明符,但声明的init-declarator-list不能为空(全局的匿名联合体类型除外,但它必须声明为静态类型(9.5))。存储类说明符作用于列表中的每一个init-declarator声明的名字,但对于其他说明符声明的名字无 阅读全文
posted @ 2006-03-27 16:18 Goncely 阅读(409) 评论(0) 推荐(0) 编辑
摘要: 7.1 说明符1、用于声明的说明符包括:decl-specifier:storage-class-specifiertype-specifierfunction-specifierfriendtypedefdecl-specifier-seq:decl-specifier-seqopt decl-specifier2、最长的decl-specifiers序列被当作declaration的decl-specifier-seq。如下所示,这个序列应该是自相容。例如:typedef char* Pc;static Pc; // error: name missing此处,声明static Pc是非法 阅读全文
posted @ 2006-03-27 16:16 Goncely 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 7 声明1、声明用于对名字的解析方式进行说明,它具有如下语法形式:declaration-seq:declarationdeclaration-seq declarationdeclaration:block-declarationfunction-definitiontemplate-declarationexplicit-instantiationexplicit-specializationlinkage-specificationnamespace-definitionblock-declaration:simple-declarationasm-definitionnamespace 阅读全文
posted @ 2006-03-27 16:15 Goncely 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 1、总论任何一个用C写的项目都是由若干文件构成,通常这些文件分为两大类:头文件和实现文件。头文件的后缀为.h,实现文件的后缀为.c。当然,也有一些文件是其他后缀,但这些文件通常也担当着头文件的角色(项目文件、配置文件及其它数据文件除外)。编译器的输入通常是实现文件,每一个实现文件对编译器来说是一个翻译单元,编译器将其翻译为目标代码,通常是一个obj文件。最后由链接器将所有的obj文件连成一个完整的可执行程序。2、头文件第一步,编译器首先对翻译单元进行预处理,包括对头文件和宏进行扩展。对头文件的扩展很简单,把include指令删除,然后把include指令所指定的头文件内容插入当前位置。这也就是 阅读全文
posted @ 2006-03-24 17:07 Goncely 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 今天down了一个Visual Parse++来研究,可没想到连测试版也需要注册码。按照提示发了封索取注册码的邮件,半天不见回应,就干脆自己动手破解。使用OllyDbg加载SSVParse.exe文件,运行一下,还好文件没有加壳,一切正常。破解过程最重要的就是找到对注册码进行操作的代码,方法有很多,但不外乎是设置断点。找了半天没找到SSVParse.exe对GetWindowText的调用,只好对MessageBoxA和strcmp函数设置断点。可惜,在提示注册码不正确的对话框弹出后,程序没有被中断。:(我把提示对话框中的提示字符串抄下来,然后在OllyDbg中查找字符参考,搜索提示字符串。幸 阅读全文
posted @ 2006-03-23 17:04 Goncely 阅读(295) 评论(0) 推荐(0) 编辑
摘要: 对象类型:object typecv限定:cv-qualified成员指针类型:pointer to member type标量类型:scalar type布局相容:layout-compatible对象表示:object representation值表示:value representation整型:integral type算术类型:arithmetic type语句:statement标准转换序列:standard conversion sequence重载:overload覆盖:override限定转换:qualification conversionscv限定签名:cv-quali 阅读全文
posted @ 2006-03-22 13:30 Goncely 阅读(234) 评论(0) 推荐(0) 编辑