MST

星途 面试题库

面试题:C++ 中宏定义的常见高级技巧及副作用示例

请列举至少两种 C++ 宏定义的高级技巧,并分别给出一个简单示例说明,同时阐述这些技巧可能带来的副作用。
22.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

技巧一:可变参数宏

  • 示例
#include <stdio.h>

#define LOG(...) printf(__VA_ARGS__)

int main() {
    LOG("This is a log message: %d\n", 10);
    return 0;
}
  • 副作用:可变参数宏可能会降低代码的可读性,特别是在宏调用嵌套或者参数较多的情况下。而且宏在预处理阶段展开,不进行类型检查,可能导致运行时错误。例如,如果传递给 LOG 的参数类型与 printf 格式字符串不匹配,编译器不会报错,但运行时可能出现错误。

技巧二:宏连接

  • 示例
#include <stdio.h>

#define CONCAT(a, b) a##b

int main() {
    int value12 = 100;
    int result = CONCAT(value, 12);
    printf("result: %d\n", result);
    return 0;
}
  • 副作用:宏连接可能会导致命名冲突。比如在不同的代码模块中,如果都使用了类似的宏连接逻辑,可能会意外地连接出相同的标识符,导致编译错误或者运行时的未定义行为。另外,宏连接使得代码阅读起来更加困难,因为连接后的标识符与原始宏参数关系不直观。