C++中预定义宏

常用的标准预定义宏包括:

cpp 复制代码
__cplusplus__  // 输出C++标准版本号
__FILE__       // 输出当前源文件的文件名
__LINE__       // 输出当前代码行号
__DATE__       // 输出编译日期(格式:Mmm dd yyyy)
__TIME__       // 输出编译时间(格式:hh:mm:ss)

除此之外,还有windows平台预定义的宏:_WIN32、_WIN64,用于跨平台代码的条件编译。

执行下面代码:

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    // 输出C++标准版本号
    cout << "__cplusplus: " << __cplusplus << endl;
    // 输出当前源文件的文件名
    cout << "__FILE__: " << __FILE__ << endl;
    // 输出当前代码行号
    cout << "__LINE__: " << __LINE__ << endl;
    // 输出编译日期(格式:Mmm dd yyyy)
    cout << "__DATE__: " << __DATE__ << endl;
    // 输出编译时间(格式:hh:mm:ss)
    cout << "__TIME__: " << __TIME__ << endl;
    
    // 64位平台同时定义了_WIN64和_WIN32,32位平台仅定义_WIN32,非Windows平台编译会输出"_WIN32: 未定义")
#ifdef _WIN64
	cout << "_WIN64: " << _WIN64 << endl;
#elif defined(_WIN32)
	cout << "_WIN32: " << _WIN32 << endl;
#else
    cout << "_WIN32: 未定义" << endl;
#endif

    return 0;
}

输出:

bash 复制代码
__cplusplus: 201703
__FILE__: D:\Desktop\Temprary_Files\temp\cpp_tmp\main.cpp
__LINE__: 10
__DATE__: Feb 22 2026
__TIME__: 21:53:59
_WIN64: 1

指定编译器不同版本__cplusplus会输出不同内容。

宏是文本替换,若存在有语法问题,很难排查,能不用宏的地方尽量不用。C++20中引入了 <source_location> 头文件和 std::source_location 类,这是一种类型安全、非宏 的方式来获取源代码位置信息(行号、文件名、函数名等),完全可以替代 LINE 、FILE 等预定义宏。

cpp 复制代码
#include <iostream>
#include <source_location>
using namespace std;

int main() {
	auto current_loc = std::source_location::current();
    cout << "调用位置信息:" << endl;
    // 获取文件名(替代__FILE__)
    cout << "文件名: " << current_loc.file_name() << endl;
    // 获取行号(替代__LINE__)
    cout << "行号: " << current_loc.line() << endl;
    // 获取列号(宏没有这个功能)
    cout << "列号: " << current_loc.column() << endl;
    // 获取函数名(替代__func__)
    cout << "函数名: " << current_loc.function_name() << endl;

    return 0;
}

输出:

bash 复制代码
调用位置信息:
文件名: D:\Desktop\Temprary_Files\temp\cpp_tmp\main.cpp
行号: 6
列号: 50
函数名: int main()
相关推荐
布莱克60515 分钟前
Swift 可选类型(Optionals)详解:从原理到实战
开发语言·安全·ssh·swift·optional·可选类型
老歌老听老掉牙31 分钟前
案例 7:二维 Rosenbrock 函数最小值(香蕉函数)
c++·pso
Severus_black1 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
瑞雪兆丰年兮2 小时前
JavaWeb-day14-SpringBootWeb原理篇
java·开发语言·spring boot·spring·bean·mybatis·javaweb
SomeOtherTime4 小时前
Rust生命周期介绍(AI回答)
开发语言·后端·rust
程序猿打工仔4 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
喵本喵叁肆4 小时前
Rényi 差分隐私:把隐私损失看成一族矩(英文原题:Rényi Differential Privacy (CSF 2017))
开发语言·r语言
Hvitur5 小时前
Java - Lambda
java·开发语言·python
xiaoye-duck5 小时前
《C++ 项目:手写大模型接入 SDK》DataManager数据管理模块:SQLite持久化存储
开发语言·数据库·c++·sqlite
Evand J6 小时前
【MATLAB例程,PMSM19】永磁同步电机(PMSM)基于多速率无迹卡尔曼滤波(UKF)的转速与转子位置估计。测量缺失、状态预测与恢复性能分析
开发语言·matlab·电机·ekf·卡尔曼·电机滤波