首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>cc++>正文

轻轻松松C to C (二)

http://www.oklinux.cn  2008-03-07  来源: vcer.net vcer  会员收藏  游客收藏  【 】 

接上一篇

二、挑战#define

#define是C提供的一条很有用的指令,但在C 中,很有可能杜绝宏指令的使用。

1 .const

宏指令允许用户指定某一标识符的值作为一个常量,如:
#define PI 3. 1415926

它也可以用来定义字符串:
#define HZK16 "HZK16F"

以下使用可以通过:

cout << "PI is“<<PI;
cout << "Filename: "<< HZK16;

但宏毕竟不是一个合法的对象,虽然它伪装得很完美。C 为用户提供了常量修饰符const,可以指定某个对象的值为常量。它阻止用户对其进行赋值或其它副作用,类似于上例:

const float PI=3.1415926;
char*const HZK16="HZK16F";
PI = 3. 14; //error
HZK16="HZK16K"; //error: Cannot modify a const object

但对于指针的处理似乎有些复杂,例如以下使用却又合法:
HZK16[5]=’r’; //ok HZK16 ="HZK16K"

清楚地了解const修饰的范围很有必要,如下是声明形式与相应含义:
char*const cpl="I love you!“; //const修饰’*’,cp1是一个指向字符的指针常量
const char*cp2="I hate you!“; //const修饰’char' cp2是一个指向字符常量的指针
const char*const cp3="Get the hell out of here!“; // const分别修饰’char’和’*’,cp3是一个指向字符常量的指针常量

因此,以下使用仍合法:
strcpy(cpl "Oh no...“);
cp2 ;

因为cpl只管盯住某一处的地址不放,而阻止其中的内容不被改写则不是它的责任,cp2则恰恰相反,它不允许你修改其中的内容,却可以被你指来指去(这个下场可能更惨)。只有使用两个修饰符(如cp3)才可能是最保险的办法。

指向const的指针不能被赋给指向非const的指针:
float*p=&PI;
//error: Cannot convert 'const float*’ to 'float*’
*p=3.14;

这条限制保证了常量的正当含义。但注意由显式转换所引起的常量间接修改是可能的:

//test08.cpp
#include <iostream.h>
void main()
{
       char * Spy;
       const char * const String = "Yahoo!";
       Spy = (char*)String;
       Spy[5] = '?';
       cout << String;
}
 
Yahoo!

**作者按:以上程序在Visual C 下运行会报内存错误。

2.内联函数(in line function)

宏在某些场合能得到类似于函数的功能,如下是一个常见的例子:
#define ADD (a b) ((a) (b))
cout<<”1 2=”<它将实现数据求和功能而输出:

但我们至少有一打理由拒绝使用它,以下是最明显的:

①宏缺少类型安全检测,如:
ADD ('A' 0. 0l);
这样的调用将被解释为合法,而事实上,很少的用户期望能写出这样的语句;

②宏不会为参数引入临时拷贝,如:

#define DOUBLE (x)((x) (x))
int i(1);
cout<<DOUBLE(i  ); //prints '3'

③宏不具有地址,例如可能在一个计算器程序中有:
case ' ': Operator = & ADD;
并不能得到合理解释。

采取函数?然而,使用函数并不是最划算的支出,它浪费了宝贵的执行时间。使用过汇编语言的读者可能知道,一般函数执行真正的函数体前后,要做一些现场保护工作,当函数体积很小时,这种冗余的工作量将会远远大于函数本身。

为此,C 提供了关键字inline,当用户希望编译器将某函数的代码直接插入到调用点时,可将其设置成inline函数,即在函数定义时加上关键字inline,如:

共2页: 上一页 1 [2] 下一页
//test09.cpp
#include <iostream.h>
inline int Add (int a int b)
{
return a   b;
}
void main O)
{
cout<<"1 2=“<<Add(1 2);
}

上一篇:轻轻松松C to C (三)   下一篇:开发框架-分析Tomcat下中文的彻底解决


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·轻轻松松C to C (三)
·运行时和编译时的安全性检查
·Web Browser Express 概述
·用C 的托管扩展针对Windows编程
·例解用 VC 6.0 实现 JNI
·与用于 C 的ISO标准保持一致
·送给初学者的礼物:游戏编程起源连载二
·送给初学者的礼物:游戏编程起源连载一
·轻轻松松C to C
·送给初学者的礼物:游戏编程起源连载三
·深入浅出谈垃圾的回收—Java 堆的管理
·一种被忽视的构造和整数溢出重现
·深入理解C语言指针奥秘系列文章之一
·二级C语言实例解答
·深入浅出VA函数的使用技巧
·Visual C# 常见问题
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·用Eclipse平台进行C/C 开发
·在 Linux 中使用共享对象
·VS:针对Java开发人员的C#编程语言
·使用智能设备扩展在C#中开发自定义控件
·Visual C# 常见问题
·二级C语言实例解答
·一种被忽视的构造和整数溢出重现
·轻轻松松C to C
·与用于 C 的ISO标准保持一致
·用C 的托管扩展针对Windows编程
·运行时和编译时的安全性检查
·轻轻松松C to C (三)
  阅读排行
·c/c++ 学习-read 函数和 write 函数
·程序员眼中的qmail(qmail源代码分析)
·Awk 基础入门:Awk 实例编程
·autoconf 和automake生成Makefile文件
·Linux下的多进程编程
·入门文章:教你学会编写Linux设备驱动
·C++自动化(模板元)编程基础与应用
·使用 GDB 调试多进程程序
·Qt 不规则窗体的实现
·嵌入式程序员应知道的几个基本问题
·Linux操作系统中GCC的应用介绍
·C语言中的指针和内存泄漏
·用GNU profiler提高代码运行速度
·vi 中的正则表达式 (Regular Expressio
·Linux 套接字编程中的 5 个隐患
网摘收藏: