内联函数
1.什么是内联函数
c语言在调用函数的时候会在代码段内跳来跳去,并且多次调用一个函数会重复申请内存的栈空间。为了解决这个问题,就可以使用内联函数。内联函数和宏定义类似,会直接把函数的代码直接替换到相应的位置,这样程序就不用重复申请栈空间和不停跳转了。内联函数可以用incline
关键字来定义,不过现在的编译器都很智能,会自动识别哪些函数需要被转换成内联函数,不需要我们操心。
2.预处理运算符
定义:在带参数的宏定义中可以使用的运算符。
- #运算符:
相当于把宏定义中的参数直接转换成字符串。
#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)
是一样的。
- ##运算符;
相当于把两个语义连接在一起,注意这与字符串的连接不一样,而是对于编译器来说,直接就把两个语义连在一起来处理了。
#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是支持的。可变参数宏的一个常见应用是更方便地打印调试信息。