news 2026/5/7 17:43:35

简单理解: __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/5/1 10:00:41

HTML Select下拉菜单切换TensorFlow模型参数

前端控件驱动AI环境切换&#xff1a;基于HTML Select与TensorFlow镜像的智能开发实践 在现代人工智能研发中&#xff0c;一个常见的痛点浮出水面&#xff1a;算法工程师刚写完一段基于 TensorFlow 2.9 的模型代码&#xff0c;准备复现论文结果时&#xff0c;却发现团队共享服务…

作者头像 李华
网站建设 2026/5/3 10:39:38

Java + Spring Boot 微服务迁移到Serverless的8个关键步骤

第一章&#xff1a;Java Spring Boot 微服务与Serverless架构概述在现代云原生应用开发中&#xff0c;Java 与 Spring Boot 已成为构建微服务的主流技术组合。其强大的生态系统、成熟的依赖注入机制以及对 RESTful 服务的天然支持&#xff0c;使开发者能够快速构建高可用、可扩…

作者头像 李华
网站建设 2026/5/2 17:10:38

用Markdown制作交互式TensorFlow学习手册

用 Markdown 构建可运行的 TensorFlow 学习系统 在人工智能教育日益普及的今天&#xff0c;一个常见的困境是&#xff1a;学习者看懂了公式和代码&#xff0c;却在本地环境配置上卡住——依赖冲突、版本不匹配、GPU 驱动缺失……最终“在我机器上跑不了”成了常态。这不仅打击初…

作者头像 李华
网站建设 2026/5/3 5:55:14

DiskInfo监控TensorFlow批量训练时的读写延迟

DiskInfo监控TensorFlow批量训练时的读写延迟 在现代深度学习系统中&#xff0c;我们常常把注意力集中在模型结构、优化器选择或GPU利用率上&#xff0c;却容易忽视一个隐藏但致命的瓶颈——数据加载。当你看到NVIDIA-smi显示GPU利用率长期徘徊在20%以下&#xff0c;而CPU核心几…

作者头像 李华
网站建设 2026/5/1 15:48:20

C++26契约编程深度解析(代码安全新纪元)

第一章&#xff1a;C26契约编程概述C26引入了原生的契约编程&#xff08;Contract Programming&#xff09;机制&#xff0c;旨在提升代码的可靠性与可维护性。契约允许开发者在函数接口中明确声明前提条件、后置条件和断言&#xff0c;由编译器或运行时系统进行验证&#xff0…

作者头像 李华
网站建设 2026/5/3 4:57:40

Git Diff比较TensorFlow模型前后版本差异

Git Diff 比较 TensorFlow 模型前后版本差异 在机器学习项目中&#xff0c;我们常遇到这样的问题&#xff1a;新训练的模型准确率下降了 2%&#xff0c;但没人说得清楚是哪次提交导致的。是数据预处理改了&#xff1f;还是不小心调低了学习率&#xff1f;又或者只是随机种子不…

作者头像 李华