王老师 预处理

原创 2006年05月27日 18:11:00

1.宏定义

语法: #define 宏名字[(形参表)] 替换文本

其中,宏名字是一个标识符;

形参表为:(形参名1, 形参名2,...形参名n), 没有类型;

替换文本是一串字符.

宏调用和函数调用不同,是把程序中所有宏调用 "宏名字(实参表)", 用替换文本(实参代替形参)代替.

没有函数的跳转过程.

例如:

#define mul(x, y) ((x) * (y))

注意:此处必须加括号,否则,

(1)mul(x - 1,  y + 1);  展开为 x - 1 * y + 1;  //内层必须加()

(2)1 / mul(x, y);  展开为1 / x * y;  //外层也必须加()

另外,替换时,实参尽可能不要有副作用.

例如:

#define max(x, y) ((x) > (y) ? (x) : (y))

max(x++, y)  展开为 ((x++) > (y) ? (x++) : (y))

2.文件包含

#include "文件名"

头文件(*.h)一般包含:

类型定义,宏定义,函数原型,外部变量定义.

调用其它文件中函数的代码,是在link的过程中由linker将*.obj文件进行link处理的.

3.条件编译

#if 条件1

代码1

#else 条件2

 代码2

#endif

4.参数个数不确定的函数

形参表写法:(形参类型1 形参名1, ..., 形参类型n  形参名n, ... )

在程序中如何获取不确定的参数?

函数库提供了 stdarg.h, 一个类型, 2个宏.

typedef void * va_list;  //va_list是一个指针类型

va_start(p, para);         //para是最后一个确定参数的名字,这个宏给指针变量p赋初值,指向第一个不确定的参数

变量 = va_arg(p, 类型说明符); 

//取出p所指的不定参数的值,类型说明符说明了这个值的类型,同时p自动的改指下一个可变参数.

示例程序代码如下:

#include "stdio.h"
#include "stdarg.h"
#include "stdlib.h"

void scanf_e(char *c, ...)
{
 char a[1000], *p, *q;
 va_list r;
 va_start(r, c);
 while(*c != '/0')
 {
  gets(a);
  switch(*c)
  {
  case 'd':
   *va_arg(r, int *) = atoi(a);
   break;
  case 'f':
   *va_arg(r, double *) = atof(a);
   break;
  case 's':
   p = va_arg(r, char *);
   q = a;
   while(*p++ = *q++);
  }
  c++;
 }
}

void main()
{
 int a;
 double b;
 char c[100];
 scanf_e("dfs", &a, &b, c);
 printf("%d/t%f/t%s", a, b, c);
}

 <补充>
找了一下源代码, <stdarg.h>.
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )

这里的宏 _INTSIZEOF(n) 挺有意思。

例如:
#include <stdio.h>

struct student
{
int id;
int sex;
int age;
char name[10];
};

struct student s1, s2;

#define size(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))

int main()
{

printf("%d/n", &s1);
printf("%d/n", &s2);

printf( "%d/n", size(student));
return 0;
}

输出结果:
4373256
4373280
24

相差24个字节,而不是3 * 4 + 10 = 22个。

宏_INTSIZEOF(n) 达到此目的。

牛。

王老师讲解:SQL Server 2005数据库nolock的使用【来自Aisino_BBS】

前两天去安徽航天信息解决A6系统的性能问题,去之前进销存项目组研发人员小苏和小卢把他们认为性能 有问题的SQL已经发给了我,我把优化方法提交给了他们。本以为到那之后会非常轻松,但还是有些插曲在其中。 ...

王老师拼音输入法的算法

N元语言模型的解码算法 分类: 微软拼音输入法开发工程师专栏2011-02-28 16:11 8155人阅读 评论(11) 收藏 举报 ----------------------...
  • fish341
  • fish341
  • 2012年07月02日 17:55
  • 9430

第一次用博客之有所想——致敬王老师

本篇文章不是技术文章。只是我个人对目前状况的总结与反思。

【传智播客】PS中的魔棒工具-王老师第一次作业!

传智播客( http://icd.itcast.cn/)是一家网页平面设计培训学院,专注于网页设计培训,平面设计培训,fash培训,ui设计培训。   【传智播客】 王老师 免费视频教程...

HTML5的优点及缺点,汇道科技王老师来解答

HTML5的优缺点是什么?作为HTML的第五次重大修改,HTML5有哪些改进?HTML5又有哪些缺点?   HTML5本身是由W3C推荐出来的,它的开发是通过谷歌、苹果,诺基亚、中国移动等几百家公司...

FPGA王老师问答

  • 2013年07月12日 16:41
  • 37KB
  • 下载

王老师ajax

  • 2013年01月07日 08:59
  • 5.1MB
  • 下载

【备忘】Java教学系列视频教程 孔浩老师 千课巨献全网最全 共26G

教程目录 01_Java 01_Java基础 01_开课之前的介绍_01.avi 02_开课之前的准备_02(jdk的安装).avi 03_开课之前的准备_03(editplus的安装)...

大四用的网络技术王老师教的03

  • 2010年08月30日 11:46
  • 5.04MB
  • 下载

大四王老师教的技术02

  • 2010年08月30日 11:37
  • 9.46MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:王老师 预处理
举报原因:
原因补充:

(最多只允许输入30个字)