【跟着小甲鱼学C语言】P41 内联函数和预处理运算符

内联函数

1.什么是内联函数

c语言在调用函数的时候会在代码段内跳来跳去,并且多次调用一个函数会重复申请内存的栈空间。为了解决这个问题,就可以使用内联函数。内联函数和宏定义类似,会直接把函数的代码直接替换到相应的位置,这样程序就不用重复申请栈空间和不停跳转了。内联函数可以用incline关键字来定义,不过现在的编译器都很智能,会自动识别哪些函数需要被转换成内联函数,不需要我们操心。

2.预处理运算符

定义:在带参数的宏定义中可以使用的运算符。

  1. #运算符:
    相当于把宏定义中的参数直接转换成字符串
#include<stdio.h>
#define PRINT(s) printf(#s)

int main()
{	
	PRINT(Hello World);
	return 0;
}

这段代码会输出字符串Hello World。工作流程是,相当于先把PRINT(Hello World)替换成printf(#Hello World),再把Hello World变成"Hello World"#后面的多个连续空格会被变成一个空格,比如说PRINT(Hello World)PRINT(Hello World)是一样的。

  1. ##运算符;
    相当于把两个语义连接在一起,注意这与字符串的连接不一样,而是对于编译器来说,直接就把两个语义连在一起来处理了
#include <stdio.h> 
#define XNAME(n) x ## n 
#define PRINT_XN(n) printf("x" #n " = %d/r/n", x ## n); 
int main(void)
{
    int XNAME(1) = 14; // 变为 int x1 = 14; 
    int XNAME(2) = 20; // 变为 int x2 = 20; 
    PRINT_XN(1)        // 变为 printf("x1 = %d/r/n", x1); 
    PRINT_XN(2)        // 变为 printf("x2 = %d/r/n", x2); 
 
    return 0; 
}
// 输出:
x1 = 14 
x2 = 20 

注意第三行 "x" #n " ,这个形式很奇怪,一共有三个引号。拼接字符串的时候要用这种三个引号的形式吗?

3.可变参数宏

#define debug(...) printf(__VA_ARGS__)

缺省号代表一个可以变化的参数表。使用保留名 __VA_ARGS__ 把参数传递给宏。当宏的调用展开时,实际的参数就传递给 printf()了。例如:

Debug("Y = %d\n", y);

而处理器会把宏的调用替换成:

printf("Y = %d\n", y);

可变参数宏不被ANSI/ISO C++ 所正式支持。因此,你应当检查你的编译器,看它是否支持这项技术,gcc是支持的。可变参数宏的一个常见应用是更方便地打印调试信息。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值