#define ARRAY_SIZE 100 double data[ARRAY_SIZE];这两行代码为值 100 定义了一个宏名称 ARRAY_SIZE,并且在数组 data 的定义中使用了该宏。惯例将宏名称每个字母采用大写,这有助于区分宏与一般的变量。上述简单的示例也展示了宏是怎样让 C 程序更有弹性的。
#define 宏名称 替换文本
#define TITLE "*** Examples of Macros Without Parameters ***" #define BUFFER_SIZE (4 * 512) #define RANDOM (-1.0 + 2.0*(double)rand() / RAND_MAX)
#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);
10.0 * -1.0 + 2.0*(double)rand() / 2147483647
#define 宏名称( [形参列表] ) 替换文本 #define 宏名称( [形参列表 ,] ... ) 替换文本
#define getchar() getc(stdin) #define putchar(x) putc(x, stdout)
#include <stdio.h> // 包含putchar()的定义 #define DELIMITER ':' #define SUB(a,b) (a-b) putchar( DELIMITER ); putchar( str[i] ); int var = SUB( ,10);
putc(':', stdout);
putc(str[i], stdout);
int var = (-10);
#define DISTANCE( x, y ) ((x)>=(y) ? (x)-(y) : (y)-(x)) d = DISTANCE( a, b+0.5 );
d = ((a)>=(b+0.5) ? (a)-(b+0.5) : (b+0.5)-(a));如果 x 与 y 没有采用括号,那么扩展后将出现表达式 a-b+0.5,而不是表达式(a)-(b+0.5),这与期望的运算不同。
// 假设我们有一个已打开的日志文件,准备采用文件指针fp_log对其进行写入 #define printLog(...) fprintf( fp_log, __VA_ARGS__ ) // 使用宏printLog printLog( "%s: intVar = %d\n", __func__, intVar );
fprintf( fp_log, "%s: intVar = %d\n", __func__, intVar );
#define printDBL( exp ) printf( #exp " = %f ", exp ) printDBL( 4 * atan(1.0)); // atan()在math.h中定义
printf( "4 * atan(1.0)" " = %f ", 4 * atan(1.0));
printf( "4 * atan(1.0) = %f ", 4 * atan(1.0));
4 * atan(1.0) = 3.141593
#define showArgs(...) puts(#__VA_ARGS__) showArgs( one\n, "2\n", three );
puts("one\n, \"2\\n\", three");
one , "2\n", three
#define TEXT_A "Hello, world!" #define msg(x) puts( TEXT_ ## x ) msg(A);
puts( TEXT_A );
puts( "Hello, world!" );
msg();
puts( TEXT_ );如果TEXT_不是一个字符串类型的标识符,编译器会生成一个错误信息。
// fn_tbl.c: 以表格形式输出一个函数的值。该程序使用了嵌套的宏
// -------------------------------------------------------------
#include <stdio.h>
#include <math.h> // 函数cos()和exp()的原型
#define PI 3.141593
#define STEP (PI/8)
#define AMPLITUDE 1.0
#define ATTENUATION 0.1 // 声波传播的衰减指数
#define DF(x) exp(-ATTENUATION*(x))
#define FUNC(x) (DF(x) * AMPLITUDE * cos(x)) // 震动衰减
// 针对函数输出:
#define STR(s) #s
#define XSTR(s) STR(s) // 将宏s展开,然后字符串化
int main()
{
double x = 0.0;
printf( "\nFUNC(x) = %s\n", XSTR(FUNC(x)) ); // 输出该函数
printf("\n %10s %25s\n", "x", STR(y = FUNC(x)) ); // 表格的标题
printf("-----------------------------------------\n");
for ( ; x < 2*PI + STEP/2; x += STEP )
printf( "%15f %20f\n", x, FUNC(x) );
return 0;
}
FUNC(x) = (exp(-0.1*(x)) * 1.0 * cos(x))
x y = FUNC(x)
-----------------------------------------
0.000000 1.000000
0.392699 0.888302
...
5.890487 0.512619
6.283186 0.533488
#undef 宏名称
#include <ctype.h> #undef isdigit // 移除任何使用该名称的宏定义 /* ... */ if ( isdigit(c) ) // 调用函数isdigit() /* ... */
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有