MST

星途 面试题库

面试题:C语言中##运算符在宏定义里的应用

请解释C语言中##运算符在宏定义中的作用,并给出一个使用##运算符连接两个标识符的宏定义示例,说明在不同参数输入下宏展开后的结果。
15.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. ##运算符在宏定义中的作用

    • 在C语言宏定义中,##运算符被称为连接运算符(token - pasting operator)。它用于将两个预处理符号(标识符等)连接成一个符号。这使得我们可以在宏定义中动态地创建新的标识符。在宏展开时,##运算符两边的符号会被合并成一个符号,前提是合并后的符号是合法的。
  2. 宏定义示例

#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()`会分别打印出相应的信息。