答案:1 宏定义即是字符串替换。宏分为无参宏和含参宏。定义宏的位置可以在函数外部也可以在函数内部(vc++ 2008 测试通过)。
宏的作用域是从定义处到取消定义命令[#undef 宏名]之间的部分,若无显式的#undef命令则默认到文件结束。可以使用defined命令可以判断宏是否被定义#if defined X (=#ifdef X),#if !defined X (= ifndef X)。
定义含参宏格式如#define SQ(y) ((y)*(y)),其中参数为y,宏得到的是y平方。为了保证宏替换的正确性,多加了3个括号。但这样的保证也是有限的,它要求y的值不能在(y)内改变,如把y换成i++将得不到期望的结果。
宏调用(实际上是宏替换)不用考虑形参的类型,这带来一定的好处。如求两个数最大值的宏#define MAX(a,b) (a>b)?a:b,实参可以是int,double等。
宏定义可以包括多个语句,如#define CHANGE(X1,X2,X3,X4) X1 += 1;X2 += 2; X3 += 3; X4 +=4;
2 文件包含命令#include的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。
源代码分布于多个文件时,建议使用调用文件+头文件+实现文件的模式。头文件中包含要用到的函数说明,类型定义,宏定义,常数值等。具体的实现放在实现文件中。在调用文件和实现文件中都包含该头文件即可。
为了避免重复包含头文件,可在头文件中使用#ifndef [头文件标示符(如X_Header等等)] + 头文件内容 + #endif模式。
3 条件编译命令可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。 这对于程序的移植和调试很有用。
条件编译有三种形式,下面分别介绍:
第一种形式根据有无对应宏定义选择编译程序段:
#ifdef 标识符 // 或 #ifndef 标示符
程序段1
#else
程序段2
#endif
第二种形式根据常量表达式值选择编译,值为非0执行if段。
#if 常量表达式
程序段1
#else
程序段2
#endif
这里一定要是常量表达式,一般为宏。若是表达式包含变量则编译器只能随便猜一个了。
第三种形式含有#elif,看个例子吧
#define ABC 3
void main(){#if ABC>0
int a=1;
printf("%d/n",a);
#elif ABC<0
int b=-1;
printf("%d/n",b);
#else
int c=0;
printf("%d/n",c);
#endif
}
其余的预编译命令如下,这里就不研究它们了。
#line 标志该语句所在的行号
# 将宏参数替代为以参数值为内容的字符窜常量
## 将两个相邻的标记(token)连接为一个单独的标记
#pragma 说明编译器信息#warning 显示编译警告信息
#error 显示编译错误信息
上一个:C语言完全不懂如何开始学习?
下一个:C语言函数的调用和定义