C和C++内置宏在代码调试、跨系统平台代码中会经常使用,本文记录说明一下。内置宏不需要调用头文件,可直接使用。在使用预定义的宏之间需要了解常用的条件编译指令,具体条件编译指令可见:


if、#else、#endif、#elif、#ifdef、#ifndef的区别和使用

1 内置的宏定义

这些宏在代码中可直接调用。

宏说明
__DATE__ 程序最后编译日期宏
__TIME__ 程序最后编译时间宏
__LINE__ 当前行数宏
__FILE__ 当前运行文件名宏
__FUNCTION__ 当前运行函数宏
__func__ 当前运行函数宏

示例代码

cout << "程序最后编译日期宏 " << __DATE__ << endl;
cout << "程序最后编译时间宏 " << __TIME__ << endl;
cout << "当前行数宏 " << __LINE__ << endl;
cout << "当前运行文件名宏 " << __FILE__ << endl;
cout << "当前运行函数宏 " << __FUNCTION__ << endl;
cout << "当前运行函数宏 " << __func__ << endl;

windows输出结果

程序最后编译日期宏 May  8 2020
程序最后编译时间宏 11:19:24
当前行数宏 12
当前运行文件名宏 c:\users\admin\desktop\test\define.cpp
当前运行函数宏 main
当前运行函数宏 main

linux输出结果

程序最后编译日期宏 May  8 2020
程序最后编译时间宏 11:19:00
当前行数宏 9
当前运行文件名宏 define.cpp
当前运行函数宏 main
当前运行函数宏 main

2 运行平台宏

这些宏主要是判断当前系统运行平台。

宏说明
WIN32、_WIN32、_WIN32_、WIN64、_WIN64、_WIN64_ windows
ANDROID、_ANDROID_ android
__linux__ linux
__APPLE__、TARGET_OS_IPHONE、TARGET_IPHONE_SIMULATOR、TARGET_OS_MAC ios、mac

示例代码

	// windows
#if defined(WIN32) || defined(_WIN32) || defined(_WIN32_) || defined(WIN64) || defined(_WIN64) || defined(_WIN64_)
cout << "hello windows" << endl; // android
#elif defined(ANDROID) || defined(_ANDROID_)
cout << "hello android" << endl; // linux
#elif defined(__linux__)
cout << "hello linux" << endl; // ios or mac
#elif defined(__APPLE__) || defined(TARGET_OS_IPHONE) || defined(TARGET_IPHONE_SIMULATOR) || defined(TARGET_OS_MAC)
cout << "hello ios/mac" << endl; // other
#else
cout << "hello unknown" << endl;
#endif

windows输出结果

hello windows

linux输出结果

hello linux

3 编译器宏

这些宏主要是判断当前程序的编译器类型。

宏说明
_MSC_VER visual studio
__GNUC__ gcc、g++
__SUNPRO_C、__SUNPRO_CC sun cc

示例代码

	// visual studio
#if defined(_MSC_VER)
cout << "hello VC" << endl; // gcc/g++
#elif defined(__GNUC__)
cout << "hello GCC / G++ " << endl; // SunCC
#elif defined(__SUNPRO_C)||defined(__SUNPRO_CC)
cout << "hello SunCC" << endl;
#endif

windows输出结果

hello VC

linux输出结果

hello GCC / G++

4 调试类型宏

这些宏主要是判断当前程序的调试类型。

宏说明
_DEBUG debug模式

示例代码

#if defined(_DEBUG)
cout << "debug" << endl;
#else
cout << "release" << endl;
#endif

windows输出结果

debug

linux输出结果

release

5 代码

所有示例运行代码如下:

#include <iostream>

using namespace std;

int main()
{ cout << "程序最后编译日期宏 " << __DATE__ << endl;
cout << "程序最后编译时间宏 " << __TIME__ << endl;
cout << "当前行数宏 " << __LINE__ << endl;
cout << "当前运行文件名宏 " << __FILE__ << endl;
cout << "当前运行函数宏 " << __FUNCTION__ << endl;
cout << "当前运行函数宏 " << __func__ << endl; // 运行平台宏
// windows
#if defined(WIN32) || defined(_WIN32) || defined(_WIN32_) || defined(WIN64) || defined(_WIN64) || defined(_WIN64_)
cout << "hello windows" << endl; // android
#elif defined(ANDROID) || defined(_ANDROID_)
cout << "hello android" << endl; // linux
#elif defined(__linux__)
cout << "hello linux" << endl; // ios or mac
#elif defined(__APPLE__) || defined(TARGET_OS_IPHONE) || defined(TARGET_IPHONE_SIMULATOR) || defined(TARGET_OS_MAC)
cout << "hello ios/mac" << endl; // other
#else
cout << "hello unknown" << endl;
#endif // 编译器宏
// visual studio
#if defined(_MSC_VER)
cout << "hello VC" << endl; // gcc/g++
#elif defined(__GNUC__)
cout << "hello GCC / G++ " << endl; // SunCC
#elif defined(__SUNPRO_C)||defined(__SUNPRO_CC)
cout << "hello SunCC" << endl;
#endif // 调试类型
#if defined(_DEBUG)
cout << "debug" << endl;
#else
cout << "release" << endl;
#endif return 0;
}

[编程基础] C和C++内置宏说明的更多相关文章

  1. 获取gcc和clang的内置宏定义

    下面是对Gcc的内置宏定义的解释: https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html https://github.co ...

  2. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  3. python面向对象的基础语法(dir内置函数、self参数、初始化方法、内置方法和属性)

    面相对象基础语法 目标 dir 内置函数 定义简单的类(只包含方法) 方法中的 self 参数 初始化方法 内置方法和属性 01. dir 内置函数(知道) 在 Python 中 对象几乎是无所不在的 ...

  4. C++ 内置宏定义 与 预编译指令

    内置宏和预编译指令, 在代码调试.单元测试.跨平台代码中经常会用到.这里记录一下. 1. 内置宏 (文件名,当前行号,当前日期,当前时间,当前执行方法名) __FILE____LINE____DATE ...

  5. 编译器内置宏__LINE__&__FUNCTION__

    编译器内置宏: 先介绍几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息. ANSI C标准中有几个标准预定义宏(也是常用的): ...

  6. c语言编译器内置宏

    注:转自http://www.cnblogs.com/lixiaohui-ambition/archive/2012/08/21/2649052.html  感谢分享 前言: 我们在写程序的时候,总是 ...

  7. 一起talk C栗子吧(第一百二十四回:C语言实例--内置宏)

    各位看官们,大家好,上一回中咱们说的是显示变量和函数地址的样例,这一回咱们说的样例是:内置宏.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在编译程序的时候,假设有语法错误,编译器就 ...

  8. python基础之函数式编程、匿名函数、内置函数

    一 函数式编程 不修改外部状态. 模仿数学里得函数进行编程. 用函数编程写出得代码相当精简. 可读性比较差. 例子: y=2*x+1 x=1 def test(x): return 2*x+1 tes ...

  9. python基础12_匿名_内置函数

    一个二分查找的示例: # 二分查找 示例 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35, 36, ...

随机推荐

  1. 前端框架Vue------>第三天学习(1)

    ` 文章目录 10 .组件基础 10.1 .什么是组件 11.什么是计算属性 10 .组件基础 10.1 .什么是组件 件是可复用的Vue实例,说白了就是一组可以重复使用的模板 <!DOCTYP ...

  2. 7_vue的数据代理,双向绑定

    回顾 object.defineProperty() 方法 区别 defineProperty == 给对象定义属性用的 需要传递三个基本参数 需要定义属性的对象名 你要定义的属性叫什么名字(比如给p ...

  3. DevOps | 如何快速提升团队软件开发成熟度,快速提升研发效能?

    今天一个小伙伴问我,如何「快速提升」一个团队的软件开发成熟度?我犯难了.我个人理解一个团队的软件开发成熟度涉及的东西很多,但最简单最直接的方法就是发钱涨工资,可是估计很多公司不愿意,那就只有扣了. 快 ...

  4. Centos镜像下载

    1.进入官网,并点击下图所示的红框(alternative downloads) 官网网址:https://www.centos.org/download/  2.在往下翻,可以看到如下图的历史版本, ...

  5. Nginx反向代理实现Tomcat+Jpress和halo

    一.利用Nginx反向代理Jpress+Tomcat 1.环境准备 服务器 IP地址 作用 系统版本 Proxy代理服务器 10.0.0.101 负载均衡Nginx Web服务器 Ubuntu2004 ...

  6. Ubuntu实现电商网站+Mysql主从复制+NFS

    Ubuntu实现电商网站+Mysql主从复制+NFS 1.环境准备 提前准备:Mysql8.0.30安装包.Mysql安装脚本.shopxo2.3.0安装包.DNS脚本 服务器 IP地址 作用 系统版 ...

  7. js把秒数转换为HH:MM:SS及时分秒格式

    /** * 转为HH:MM:SS * @param second * @returns {string} * @private */ var _showTime = function (second) ...

  8. 【Zulip】邮件系统配置

    通过docker-compose(docker-zulip)部署Zulip实例时需要配置邮件系统 SETTING_ZULIP_ADMINISTRATOR: '...@qq.com' SETTING_E ...

  9. NC 使用Nginx实现https的反向代理

    summary: [通过Nginx实现NCC的https访问,并解决UClient应用的问题] 1 概述 通过Nginx 安装配置反向代理,实现NC.NCC的https访问. 本文以NCC2005为例 ...

  10. Go map 竟然也会发生内存泄露?

    Go 程序运行时,有些场景下会导致进程进入某个"高点",然后就再也下不来了. 比如,多年前曹大写过的一篇文章讲过,在做活动时线上涌入的大流量把 goroutine 数抬升了不少,流 ...