面试题答案
一键面试在C语言中,并没有##
运算符直接用来根据传入参数的数量和类型动态生成合适的函数调用代码,但##
运算符可以用于连接标记(token)。下面是一个使用##
运算符的可变参数宏示例,通过VA_ARGS宏和##
运算符模拟简单的函数调用生成:
#include <stdio.h>
// 可变参数宏定义
#define CALL_FUNC(func, ...) func(__VA_ARGS__)
// 示例函数
void print_numbers(int a, int b) {
printf("Numbers: %d, %d\n", a, b);
}
void print_string(const char* str) {
printf("String: %s\n", str);
}
int main() {
// 调用可变参数宏
CALL_FUNC(print_numbers, 10, 20);
CALL_FUNC(print_string, "Hello, World!");
return 0;
}
宏展开过程:
-
CALL_FUNC(print_numbers, 10, 20);
- 宏展开时,
CALL_FUNC
被替换为print_numbers(10, 20)
,然后调用print_numbers
函数。
- 宏展开时,
-
CALL_FUNC(print_string, "Hello, World!");
- 宏展开时,
CALL_FUNC
被替换为print_string("Hello, World!")
,然后调用print_string
函数。
- 宏展开时,
这里虽然没有完全实现根据参数数量和类型动态生成函数调用代码,但展示了##
运算符在可变参数宏中的一种简单应用。如果要实现更复杂的根据参数数量和类型动态生成函数调用代码,需要使用C11的_Generic选择表达式(C11特性),但题目要求基于##
运算符,所以以上是在其基础上的一种接近要求的实现。