定义的理解"/>
宏定义的理解
宏定义的一般形式为: #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 DAYint 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; // 将函数的地址赋给函数指针 kprintf("\n%d\n", (*k)(2, 5)); // 通过函数指针执行函数printf("%d\n", k(2, 5));
}
更多推荐
宏定义的理解
发布评论