news 2026/3/25 22:03:43

简单理解: __FUNCTION__ 是什么?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
简单理解: __FUNCTION__ 是什么?

1. 什么是__FUNCTION__

__FUNCTION__是 C/C++ 编译器提供的预定义宏(也叫内置宏),它会在编译阶段被自动替换为当前函数的名称(字符串形式)。简单来说,它就是一个 “函数名标签”,能让程序在运行时知道自己正处在哪个函数里。

需要注意:

  • 它是编译器扩展(非标准 C/C++,但几乎所有主流编译器如 GCC、Clang、MSVC 都支持);
  • __func__(C99 标准)功能几乎一致,__FUNCTION__是更早的非标准写法,兼容性更广。

2.__FUNCTION__的核心用途

最核心的价值是调试和日志输出,其次是简化代码维护,具体看这几个场景:

场景 1:调试 / 日志(最常用)

当程序报错或输出日志时,用__FUNCTION__可以精准定位到问题所在的函数,不用手动写函数名,既高效又避免写错。

示例代码:

#include <stdio.h> void calculate_sum(int a, int b) { // 打印当前函数名 + 关键信息,方便调试 printf("[%s] 开始计算 %d + %d\n", __FUNCTION__, a, b); int sum = a + b; printf("[%s] 计算结果:%d\n", __FUNCTION__, sum); } void print_error(const char* msg) { // 错误日志中带上函数名,快速定位问题 fprintf(stderr, "[ERROR][%s]:%s\n", __FUNCTION__, msg); } int main() { calculate_sum(3, 5); print_error("参数不能为空"); return 0; }

输出结果

[calculate_sum] 开始计算 3 + 5 [calculate_sum] 计算结果:8 [ERROR][print_error]:参数不能为空
场景 2:断言(Assert)增强

结合assert使用,断言失败时能直接显示出错的函数名,定位更精准:

#include <assert.h> #include <stdio.h> void divide(int a, int b) { // 断言失败时,会打印函数名 + 断言条件 assert(b != 0 && __FUNCTION__); printf("%d / %d = %d\n", a, b, a/b); } int main() { divide(10, 0); // 触发断言 return 0; }

输出(GCC)

a.out: test.c:7: divide: Assertion `b != 0 && __FUNCTION__' failed. Aborted (core dumped)

能直接看到是divide函数中b=0导致断言失败。

场景 3:简化代码维护

如果手动写函数名到日志里,后续修改函数名时需要同步改日志中的字符串,容易遗漏;用__FUNCTION__则完全不用管,编译器会自动更新。

3. 注意事项

  • __FUNCTION__只在函数内部有效,全局作用域中使用会报错 / 无意义;
  • C++ 中还可以用__PRETTY_FUNCTION__(GCC/Clang)或__FUNCSIG__(MSVC),能显示更详细的函数签名(如参数类型、返回值、类名);
  • 它是编译期替换,不是运行时获取,性能无损耗。

总结

  1. __FUNCTION__是编译器内置宏,编译时替换为当前函数名(字符串);
  2. 核心用途是调试 / 日志 / 断言,能精准定位代码执行位置,简化维护;
  3. 兼容性好,几乎所有 C/C++ 编译器都支持,是调试排错的实用工具。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/24 2:56:57

深入理解C++26 std::execution(从原理到高性能实践)

第一章&#xff1a;C26 std::execution 并发模型概览C26 引入了全新的 std::execution 命名空间&#xff0c;旨在统一和简化并发与并行操作的编程模型。该模型为算法提供了更灵活的执行策略&#xff08;execution policies&#xff09;&#xff0c;不仅扩展了传统的顺序、并行和…

作者头像 李华
网站建设 2026/3/22 23:29:30

【C++量子计算实战秘籍】:从零构建高效内存管理架构

第一章&#xff1a;C量子计算模拟内存管理架构综述在C构建的量子计算模拟器中&#xff0c;内存管理是决定系统性能与可扩展性的核心环节。由于量子态的指数级增长特性&#xff08;n个量子比特需2^n维复向量表示&#xff09;&#xff0c;传统堆栈分配策略难以满足高效、低延迟的…

作者头像 李华
网站建设 2026/3/19 15:05:31

从零到专家,constexpr在C++26中的革命性应用,你不可错过的5个实战场景

第一章&#xff1a;从零开始理解C26中的constexpr革命C26 正在将编译时计算的能力推向新的高度&#xff0c;其中最引人注目的演进之一便是对 constexpr 的全面增强。这一变革不仅扩展了可在常量表达式中执行的操作范围&#xff0c;还允许更多标准库组件在编译期安全使用。const…

作者头像 李华
网站建设 2026/3/23 23:37:00

孤能子视角:“融智学“理论分析,深入认识

(内容比较长)我的问题:4. 融智学是科学吗&#xff1f;5. 我看融智学的定义假设严重依赖中文语义。6. 我感觉它的思路与现在的数据大模型不大匹配&#xff0c;可能用在数据生产上。7. 试试看 &#xff08;邀请将上一观点具体化&#xff09;8. 它像不像是一个整理知识的工具(框架…

作者头像 李华
网站建设 2026/3/13 19:22:32

C++26任务调度革命(优先级队列实战指南)

第一章&#xff1a;C26任务调度机制的演进与变革C26标准在并发与并行计算领域引入了革命性的任务调度机制&#xff0c;旨在提升多核架构下的执行效率与资源利用率。新标准通过标准化任务调度器&#xff08;Scheduler&#xff09;与执行上下文&#xff08;Execution Context&…

作者头像 李华