面试题答案
一键面试-
##运算符在宏定义中的作用:
- 在C语言宏定义中,
##
运算符被称为连接运算符(token - pasting operator)。它用于将两个预处理符号(标识符等)连接成一个符号。这使得我们可以在宏定义中动态地创建新的标识符。在宏展开时,##
运算符两边的符号会被合并成一个符号,前提是合并后的符号是合法的。
- 在C语言宏定义中,
-
宏定义示例:
#define CONCAT(a, b) a##b
- 不同参数输入下宏展开后的结果:
- 示例1:
- 假设我们有以下代码:
- 示例1:
#include <stdio.h>
#define CONCAT(a, b) a##b
int main() {
int num1 = 10;
int num2 = 20;
int CONCAT(num, 1) = num1;
int CONCAT(num, 2) = num2;
printf("num1 = %d, num2 = %d\n", num1, num2);
return 0;
}
- 在这个例子中,`CONCAT(num, 1)`会被展开为`num1`,`CONCAT(num, 2)`会被展开为`num2`。这样就通过宏定义动态地创建了两个变量名`num1`和`num2`。
- 示例2:
- 再看一个函数指针的例子:
#include <stdio.h>
#define CONCAT(a, b) a##b
void func1() {
printf("This is func1\n");
}
void func2() {
printf("This is func2\n");
}
int main() {
void (*CONCAT(func_ptr, 1))() = func1;
void (*CONCAT(func_ptr, 2))() = func2;
CONCAT(func_ptr, 1)();
CONCAT(func_ptr, 2)();
return 0;
}
- 这里`CONCAT(func_ptr, 1)`展开为`func_ptr1`,`CONCAT(func_ptr, 2)`展开为`func_ptr2`,它们分别是指向`func1`和`func2`函数的函数指针。调用`func_ptr1()`和`func_ptr2()`会分别打印出相应的信息。