MST
星途 面试题库

面试题:C语言可变参数宏与编译优化

假设你需要定义一个可变参数宏 `DEBUG_PRINT`,在调试模式(通过定义 `DEBUG` 宏来控制)下,该宏要能够打印出函数名、文件名、行号以及可变参数的内容。在非调试模式下,这个宏不能产生任何代码开销。请给出该宏的完整定义,并阐述如何利用编译器特性进行优化以减少不必要的代码生成。
23.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#ifdef DEBUG
#define DEBUG_PRINT(...) printf("Function: %s, File: %s, Line: %d, ", __func__, __FILE__, __LINE__); printf(__VA_ARGS__); printf("\n")
#else
#define DEBUG_PRINT(...)
#endif

利用编译器特性优化

现代编译器(如 GCC、Clang)通常能够在编译时优化掉空宏。当 DEBUG 未定义时,编译器在预处理阶段会将 DEBUG_PRINT 替换为空,从而不会生成任何代码,减少了不必要的代码生成。同时,使用 __func____FILE____LINE__ 这些编译器内置宏,编译器在编译时就能确定这些值,进一步优化代码生成。