MST

星途 面试题库

面试题:C语言##运算符连接标记在跨平台代码生成中的应用

在跨平台项目中,不同平台可能有不同的函数命名规范。例如,Windows平台函数命名前缀可能是 `win_`,Linux平台可能是 `lin_`。请使用##运算符编写一个宏系统,根据预定义的平台宏(如 `#define PLATFORM_WINDOWS` 或 `#define PLATFORM_LINUX`),动态生成符合相应平台命名规范的函数调用代码。要求宏系统能处理函数参数传递等复杂情况,并且代码具有较好的可维护性和扩展性。
32.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 假设函数参数为 int 类型
// 定义宏来生成符合平台规范的函数调用
#ifdef PLATFORM_WINDOWS
#define CALL_FUNC(func_name, ...) win_##func_name(__VA_ARGS__)
#elif defined PLATFORM_LINUX
#define CALL_FUNC(func_name, ...) lin_##func_name(__VA_ARGS__)
#else
#error "Unsupported platform"
#endif

// 模拟 Windows 平台的函数
void win_test_function(int a) {
    printf("Windows function called with argument: %d\n", a);
}

// 模拟 Linux 平台的函数
void lin_test_function(int a) {
    printf("Linux function called with argument: %d\n", a);
}

int main() {
    #ifdef PLATFORM_WINDOWS
    CALL_FUNC(test_function, 10);
    #elif defined PLATFORM_LINUX
    CALL_FUNC(test_function, 20);
    #endif
    return 0;
}

解释:

  1. 宏定义部分:使用 ## 运算符将平台前缀和函数名连接起来,形成符合平台规范的函数调用。__VA_ARGS__ 用于传递可变参数。
  2. 模拟函数部分:分别定义了 Windows 和 Linux 平台下的模拟函数,这里只是简单打印接收到的参数。
  3. main 函数部分:根据预定义的平台宏,调用相应平台的函数,并传递参数。如果没有定义合适的平台宏,会报错 Unsupported platform。这样的代码结构易于维护和扩展,若新增平台,只需在宏定义部分添加新的条件分支即可。