宏定义的理解

宏定义的一般形式为: #define 标识符 字符串    (下面的例子以 #define PI 3.1415926 为例)

     #define宏定义不是语句,所以后面不用加分号,若加了分号,宏定义的时候会把分号算进去。

     宏定义的作用从定义开始(#define PI 3.1415926) 到源程序结束,若要在某处终止该宏定义的作用,可用 #undef PI命令。

     若宏明在源程序中用引号括起来,则预处理程序不对其作宏替换( 如 printf() 输出中的引号)。

     宏定义可以嵌套使用,宏定义的字符串可以有之前宏定义过的标识符,也可以有变量参数,但在程序执行时,变量需在该宏定义使用之前定义好。

     在带参数的宏定义中,字符串内的形参通常要用括号括起来,以避免出错 (因为 #define 宏定义是简单替换,会涉及到优先级问题,加和不加括号的优先级可能不一样)。 带参宏定义和带参函数很相似,但本质上是不同的。

下面是关于 #define 的用法:

     注意,带参宏定义依然是简单替换,搞不好容易错。下图中,第一次时,一行里进行两次 i++,所以5次 printf() 里只输出 3 次。

 

下面是关于 typedef 的用法:

#include<stdio.h>
typedef int NUM1;            // typedef 声明 整型类型
typedef int NUM2[100];       // typedef 声明 整型数组类型
typedef char* p;             // typedef 声明 指针类型
typedef int (*j)();          // typedef 声明 函数指针类型
typedef struct {             // typedef 声明 结构体类型
	int year;
	int month;
	int day;
}DAY; // DAY 是结构体名称,可用结构体名称来定义外部变量,即DAY 等于struct DAY

int max(int a,int b){
	int c;
	c = (a > b) ? a : b;
	return c;
}

void main() {
	int l;
	NUM1 num1[100] = { 1,2,3 };
	NUM2 num2 = { 4,5,6 };
	DAY Day;
	p q;
	j k;

	q = "abcd";
	Day.year = 2002;
	Day.month = 4;
	Day.day = 30;
	printf("\ntypedef 声明整型类型:\n");
	printf("%d  %d\n", sizeof(NUM1), sizeof(num1));
	printf("%d\n", num1[1]);
	printf("\ntypedef 声明整型数组类型:\n");
	printf("%d  %d\n", sizeof(NUM2), sizeof(num2));
	printf("%d\n", num2[1]);
	printf("\ntypedef 声明结构体类型:\n");
	printf("%d-%02d-%02d\n",Day.year,Day.month,Day.day);
	printf("\ntypedef 声明指针类型:\n");
	printf("%s\n", q);
	printf("\ntypedef 声明函数指针类型:\n");
	k = max;  // 将函数的地址赋给函数指针 k
	printf("\n%d\n", (*k)(2, 5)); // 通过函数指针执行函数
	printf("%d\n", k(2, 5));
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值