题目重点:解释 C 函数名与原型规则,比较可变参数、宏和显式命名的能力。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 问题讨论 C,不把 C++ overload 或模板归入 C。
解题路线
- C 没有按参数类型建立同名重载集合的语言机制,同一可见函数标识符需要兼容声明。参数原型用于检查调用,不用于选择多个同名实现。
- C++ 根据候选签名做重载解析;链接时常见 name mangling 支撑实现,但语言规则不能简化成“C 链接器弱”。
- C 通常使用不同名字、带 tag 的结构/union 或函数指针。_Generic 可在编译期选择表达式;宏不是完整 C++ 重载机制。
- 可变参数只改变传参合同,调用者与被调者仍需约定类型,错误会破坏安全;不宜把 printf 式协议当自动重载。
手动走一遍
add_int(int,int) 与 add_double(double,double) 在 C 用不同名称;写两个同名不兼容原型不成立。_Generic 可按表达式类型挑选对应函数,但多参数、转换和错误诊断需要自己设计。
规模与取舍
选择机制多在编译期,运行成本取决于实际函数;可变参数的类型安全和维护成本需明确。
易错点与追问
容易失分的边界
- C 是弱类型所以不能重载。
- 可变参数自动知道实参类型。
- 把 C++ 示例当 C 示例。
继续深挖
- C API 如何保持 ABI 稳定?
- 何时用函数指针实现策略?
