C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
  • 技术文档
  • 前沿资讯
  • 常用软件
  • 在线工具
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
  • 技术文档
  • 前沿资讯
  • 常用软件
  • 在线工具
关于
  • 基础

    • C++ 基础 - 学习路线
    • C++ 基础 - 知识点
    • C++ 基础 - 面向对象
    • C++ 基础 - 语法糖
    • C++ 基础 - 关键字
    • C++ 基础 - 常用宏定义
    • C++ 基础 - 宏函数、内联函数、普通函数
  • 函数

    • C++ 函数 - 闭包
    • C++ 函数 - Linux系统调用Hook
    • C++ 函数 - getopt函数分析以及命令行解析
    • C++ 函数 - 函数指针及其应用
    • C++ 函数 - 作用域运算符::的使用
    • C++ 函数 - 智能指针shared_ptr的使用
    • C++ 函数 - struct结构体学习
    • C++ 函数 - typedef 语句的使用
    • C++ 函数 - va_list函数学习
  • 知识点

    • C++ 知识点 - 写时拷贝技术(copy-on-write)
    • C++ 知识点 - 前向声明(forward declaration)
    • C++ 知识点 - 头文件.h 和 源文件.cpp 以及多重定义(multiple definition)
    • C++ 知识点 - 为什么C语言不支持函数重载,C++又是如何支持的
    • C++ 知识点 - return 局部变量
    • C++ 知识点 - linux下c/cplusplus头文件和动态库的搜索
    • C++ 知识点 - 模板特化与偏特化
  • IO框架

    • C++ IO框架 - I/O 复用
    • C++ IO框架 - select 函数
    • C++ IO框架 - poll 函数
    • C++ IO框架 - epoll 函数
    • C++ IO框架 - Reactor 和 Proactor
  • 新版本特性

    • C++ 新版本特性 - C++11
    • C++ 新版本特性 - C++14
    • C++ 新版本特性 - C++17
    • C++ 新版本特性 - C++20

C++ 基础 - 常用宏定义

  • 示例

概述

https://www.techiedelight.com/zh/find-name-of-the-calling-function-in-cpp/

编译器内置宏:

ANSI C标准中有几个标准预定义宏(也是常用的):

  • LINE:在源代码中插入当前源代码行号;
  • FILE:在源文件中插入当前源文件名;
  • DATE:在源文件中插入当前的编译日期
  • TIME:在源文件中插入当前编译时间;
  • STDC:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
  • __cplusplus:当编写C++程序时该标识符被定义,例如__cplusplus199711,__cplusplus201103。
  • FUNCTION:调用函数的名称

编译器在进行源码编译的时候,会自动将这些宏替换为相应内容。

标识符__LINE__和__FILE__通常用来调试程序;

标识符__DATE__和__TIME__通常用来在编译后的程序中加入一个时间标志,以区分程序的不同版本;

这四个都是预编译宏,不是包含在头文件中的:

  • __FILE__是当前编译的文件的文件名 是一个字符串
  • __TIME__是当前编译的文件的编译时间 格式是hh:mm:ss 是字符串
  • __DATE__是当前编译的文件的编译日期 格式是Mmm:dd:yyyy 是字符串
  • __LINE__是调用该宏语句所在的行数,是个十进制数

应用场景:在后台程序运行出问题时,详尽的日志是必不可少的,这里提供一个能自动记录日志触发点文件名、行号、函数名的方法,通常在日志系统中使用。

示例

示例:

详情
#include <iostream>
using namespace std;

int main()
{
    cout << "__LINE__" << __LINE__ << endl;
    cout << "__FILE__" << __FILE__ << endl;
    cout << "__DATE__" << __DATE__ << endl;
    cout << "__TIME__" << __TIME__ << endl;
    cout << "__STDC__" << __STDC__ << endl;
    cout << "__cplusplus" << __cplusplus << endl;
    cout << "__FUNCTION__" << __FUNCTION__ << endl;
    
    return 0;
}

执行结果:

详情

[root@VM-16-6-centos multidefine]# g++ test1.cpp -o test1 [root@VM-16-6-centos multidefine]# ./test1 LINE: 6 FILE: test1.cpp DATE: Feb 20 2023 TIME: 14:23:31 STDC: 1 __cplusplus: 201402 FUNCTION: main

[root@VM-16-6-centos multidefine]# g++ test1.cpp -o test1 --std=c++11 [root@VM-16-6-centos multidefine]# ./test1 LINE: 6 FILE: test1.cpp DATE: Feb 20 2023 TIME: 22:19:39 STDC: 1 __cplusplus: 201103 FUNCTION: main

Last Updated:
Contributors: klc407073648
Prev
C++ 基础 - 关键字
Next
C++ 基础 - 宏函数、内联函数、普通函数