常量&宏
define定义标识符常量
#define MAX 10000
define定义宏
#define ADD(X,Y) X+Y
int main()
{
printf("%d\n",ADD(2,3));//打印结果为5
printf("%d\n",4*ADD(2,3));//打印结果为11 4传递给了2 -->4*2+3
return 0;
}
想要上面打印出20需要将
#define ADD(X,Y) X+Y //改成 #define ADD(X,Y) ((X)+(Y))
在 C 语言中,可以采用命令 #define 来定义宏。该命令允许把一个名称指定成任何所需的文本,例如一个常量值或者一条语句。在定义了宏之后,无论宏名称出现在源代码的何处,预处理器都会把它用定义时指定的文本替换掉。
没有参数的宏定义,采用如下形式:
#define 宏名称 替换文本
“替换文本”前面和后面的空格符不属于替换文本中的内容。替代文本本身也可以为空。下面是一些示例:
#define TITLE "*** Examples of Macros Without Parameters ***"
#define BUFFER_SIZE (4 * 512)
#define RANDOM (-1.0 + 2.0*(double)rand() / RAND_MAX)
标准函数 rand()返回一个伪随机整数,范围在 [0,RAND_MAX] 之间。rand()的原型和 RAND_MAX 宏都定义在标准库头文件 stdlib.h 中。
一个简单的例子:(只是简单的了解一下后续再深入)
#include <stdio.h>
#include <stdlib.h>
/* ... */
// 显示标题
puts( TITLE );
// 将流fp设置成“fully buffered”模式,其具有一个缓冲区,
// 缓冲区大小为BUFFER_SIZE个字节
// 宏_IOFBF在stdio.h中定义为0
static char myBuffer[BUFFER_SIZE];
setvbuf( fp, myBuffer, _IOFBF, BUFFER_SIZE );
// 用ARRAY_SIZE个[-10.0, +10.0]区间内的随机数值填充数组data
for ( int i = 0; i < ARRAY_SIZE; ++i )
data[i] = 10.0 * RANDOM;
用替换文本取代宏,预处理器生成下面的语句:
puts( "*** Examples of Macros Without Parameters ***" );
static char myBuffer[(4 * 512)];
setvbuf( fp, myBuffer, 0, (4 * 512) );
for ( int i = 0; i < 100; ++i )
data[i] = 10.0 * (-1.0 + 2.0*(double)rand() / 2147483647);
带参的宏:
带参宏定义的一般形式为 #define 宏 名(形参表) 字符串
带参宏调用的一般形式为:宏 名(实参表);
#define M(X,Y) ((X)*(Y)) /*宏定义*/
k=M(5,3); /*宏调用*/
而且宏名和形参表之间不能有空格,例如
#define M(X,Y) ((X)*(Y)) //正确
#define M (X,Y) ((X)*(Y)) //错误