易截截图软件、单文件、免安装、纯绿色、仅160KB

读《C和指针》笔记摘要【5】

2010-04-09
第十四章   预处理器
1、#define 替换
在程序中扩展#define定义符号和宏时,需要涉及几个步骤;
①、在调用宏时,首先对参数进行检查,看看是否包含了任何由#define定义的符号,如果是,它们首先被替换;
②、替换文件随后被插入到程序中原来文件的位置,对于宏,参数名被他们的值替代;
③、最后,再次对结果文本进行扫描,看看它是否包含了由#define定义的符号,如果是,就重复上述处理过程;
2、宏参数和#define定义可以包含其他#define定义的符号,但是宏不可以出现递归;
3、#define PRINT( FORMAT, VALUE )  \
printf( "the value of "#VALUE" is "FORMAT" \n", VALUE )
4、宏与类型无关
5、下面的执行结果:
#define MAX( a, b )     ( (a) > (b) ? (a) : (b) )
z = MAX( x++, y++ );  (其中x = 5;y = 8)
结果:x = 6;y = 10;z = 9;
原因:z = ( (x++) > (y++) ? (x++) : (y++));
6、#undef  (预处理指令,用于移除一个宏定义)
7、条件编译:在编译一个程序时,如果我们可以选择某条语句或某组语句,进行翻译或者被忽略,常常显得很方便。只用于调试程序的语句就是一个明显的例子,他们不应该出现在程序的产品版本中,但是你可能并不像把这些语句从源代码中物理删除,因为需要一些维护性修改时,你可能需要重新调试这个程序,还需要这些语句;
8、条件编译:#if 常量表达式 ——这个由预处理器进行求值
statement
#endif
9、所谓常量表达式,就是说它或者是字面值常量或者是一个#define定义的符号,如果变量在执行期前无法获得他们的值,那么他们如果出现在常量表达式中就是非法的,因为他们的值在编译时是不可预测的;
10、条件编译:
#if 常量表达式
statement
#elif 常量表达式
statement
#else
other statement
#endif
11、判断是否被定义:
①、#if   defined(待判断名)
②、#ifdef    待判断名
③、#if   !defined(待判断名)
④、#ifndef  待判断名
        其中#if的功能更强!!
12、头文件嵌套,标准要求编译器必须至少支持8层的头文件嵌套,一般来说,一到两层也差不多;
13、多重包含在绝大多数情况下出现于大型程序中,它往往需要使用很多头文件,因此要发现这种情况并不容易,要解决这种问题,我


相关文档:

关于c,c++输出格式控制

1.
printf("%.9lf\n",sum); 
//输出小数点后9位不省去末尾多余的0
2.
printf("%.10g\n",sum);
 //输出小数点后9位不省去末尾多余的0
3.
#include<iomanip>
cout<<setprecision(10)<<sum<<endl;
//输出小数点后9位省去末尾多余的0
4. 
#include<iomanip>
cout.pre ......

keil C 从零学起 教训1

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num;
void main()
{
 TMOD=0x01;
 TH0=(65536-45872)/256;
 TL0=(65536-45872)%256;
 EA=1;
 ET0=1;
 TR0=1;
 P1=0xFF;
 while(1);
}
void T0_time() interrupt 1
{
  ......

我的C实践(7):位计数

  位计数就是对一个数中具有某些特征的位进行计数。看下面实现:
/* bitscount.c:位计数 */
/* 计算x中1位的数目:方案1,采用分治策略 */
inline int pop(unsigned x){
/* 对每个2位字段,先析出其右端的1位,再析出其左端的1位,然后让这两个位相加 */
x=(x & 0x55555555)+((x>>1) & 0x555555 ......

我的C实践(9):位和字节的重排

  位和字节的重排在密码学算法中有广泛的应用。
/* rearran.c:位和字节的重排 */
/* 位反转:以字的中心为对称点进行位反射
例如: abcd efgh ijkl mnop ABCD EFGH IJKL MNOP
位反转:PONM LKJI HGFE DCBA ponm lkji hgfe dcba */
unsigned rev(unsigned x){
/* 交换相邻的单个位 */
x=(x & 0x5 ......

【转】c代码优化


1、选择合适的算法和数据结构
选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。
在许多 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号