欢迎光临散文网 会员登陆 & 注册

C语言宏定义函数指针

2022-09-10 12:08 作者:凫水亿  | 我要投稿

C语言只要宏定义写得好,谁知道你代码写的是什么,哈哈,开句玩笑。宏定义对于C还是非常重要的,它可以帮助代码可读性更强( 对于自己 ),整理破碎的代码,以及可以玩各种骚操作,据说 Lisp 调用 C 就是使用 C 语言的宏定义来处理。

今天我们用一个例子来了解宏定义函数指针。但在此之前,需要知道什么是预处理。

预处理过程

预处理是 C 语言编译过程中的一个阶段,在 C 语言编译过程中,大致经历了四个步骤:预处理、编译、汇编、链接;今天我们只讲预处理过程,预处理就是将带有 # 号的指令、和注释进行处理,包括我们熟知的 #include、#define、#pragma 等等。

  • #define N 45    宏定义,本质上是符号替换,假设有那么一条指令: int demo1 = N; 经过预处理之后就变成了: int demo1 = 45; 再假设: #define CALCULATE (34 * 9 + 12 / (2 - 55))  int demo2 = CALCULATE; (注意,这是两个语句,请将 #define CALCULATE (34 * 9 + 12 / (2 - 55)) 单独写作一行)预处理之后就变成了 int demo1 = (34 * 9 + 12 / (2 - 55)); 其结果不难看出,预处理就是将宏定义的内容直接替换到使用宏的位置。

  • 宏定义不能直接定义字符串或字符,因为字符是类型,字符串更不可能,当你使用宏定义,定义了一个字符或者字符串,在预处理过程中,编译器会报错,并且提示你该符号未定义error: 'c' undeclared (first use in this function) ,要想使用宏定义字符串,只能使用带参数的宏定义,即 #define NAME1(n) #n ,# 号会将传递进来的 n 转换为字符串,举个例子,#define NAME1(n) #n printf("%s",NAME(hello)); 注意,这是两个语句,请将 #define CALCULATE (34 * 9 + 12 / (2 - 55)) 单独写作一行)经过NAME()处理后,hello的两端将被 " 包裹--"hello"。

 了解了一些基础知识后,我们准备进入主题

定义一些数据

假设我们需要执行这样一个函数,将所有的传入的结果进行相乘

第一第二个参数,使用 int 型,第三第四个参数传递 void * 指针,然后在函数内进行运算,得到结果再进行相乘。

我们先声明与实现处理第三与第四个参数的函数。

然后再分别定义函数指针,这样就可以通过函数指针调用函数了。

然后我们对指针使用宏定义进行包装,在预处理的时候就被替换为了 add 与 divi ,而这两个符号都是函数指针

定义两个宏来使用

最后是函数 int multiply(int a,int b,void *,void *); 实现

第二行将传递进来的 pending 指针,转换为函数指针,在函数内可以使用 add 调用函数了。

第三行的 Div 是宏,如果定义在全局变量区,那么预处理之后变成了 divi,而 dive 正是指向函数 divide 的函数指针

第四行是空行

第五行 将所有的数据进行相乘,包括现有的,以及调用函数后产生的返回值

调用函数

现在,我们调用函数

注意,第三个参数与第四个参数现在都是 void *指针

其中 (void *) 还可以使用宏定义一次---- #define ItsAHinstance (void *) ,使用的时候使用宏ItsAHinstance 代替  (void *) 即可,所以看起来,有那么一点...不像 C 了

最后我们使用 printf() 函数,将数据打印出来

结果

代码全貌


C语言宏定义函数指针的评论 (共 条)

分享到微博请遵守国家法律