查看C++ 预定义宏的方法

 更新时间:2026年05月21日 09:08:36   作者:java叶新东  
本文主要介绍了查看C++ 预定义宏的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

什么是预宏定义

预定义宏是C语言中标准编译器预先定义的宏,当我们编写跨平台程序时,有时候需要知道对应平台的工具链GCC预定义宏,用来判断一些平台特性

预定义宏特征

预定义宏有两个特征:

  1. 无需提供它们的定义,就可以直接使用。
  2. 预定义宏没有参数,且不可被重定义。

预定义的宏一般分为两类:标准预定义宏、编译器预定义宏。
常用的几个标准预定义宏有以下几个:

    std::cout <<"当前行号:"<<__LINE__ << std::endl; // 当前行号:15
	
    std::cout <<"当前文件:"<<__FILE__ << std::endl; // 当前文件:/Users/yexd/Documents/project_cpp/cpp_learn/lesson_26__LINE__.cpp

    std::cout <<"当前日期:"<<__DATE__ << std::endl; // 当前日期:Apr 16 2023

    std::cout <<"当前时间:"<<__TIME__ << std::endl; // 当前时间:10:18:11
	
    std::cout <<"当前函数:"<<__FUNCTION__ << std::endl; // 当前函数:main
	
    //__STDC__:判断当前的编译器是否为标准C编译器,若是则返回值1
    std::cout <<"当前编译器:"<<__STDC__ << std::endl; // 当前编译器:1

常见操作系统预定义宏

OSMacroDescription
UNIX Environment __unix__
UNIX Environment__unix
Linux kernellinux
GNU/Linuxgnu_linux
Mac OS X & iOSAPPLE苹果系统
AndroidANDROID安卓系统
Windows_WIN32Defined for both 32-bit and 64-bit environments
Windows_WIN64Defined for 64-bit environments

gcc 查看gcc默认的内置宏定义

gcc -dM -E - < /dev/null
或
cpp -dM /dev/null

指令说明

  • -E 预处理后即停止,不进行编译。预处理后的代码送往标准输出。GCC忽略任何不需要预处理的输入文件。
  • -dM 告诉预处理器输出有效的宏定义列表(预处理结束时仍然有效的宏定义)。该选项需结合`-E’选项使用。

结果如下

yexd@yexddeMacBook-Pro lesson_27_namespace % gcc -dM -E - < /dev/null
#define _LP64 1
#define __APPLE_CC__ 6000
#define __APPLE__ 1
#define __ATOMIC_ACQUIRE 2
#define __ATOMIC_ACQ_REL 4
#define __ATOMIC_CONSUME 1
......

clang 查看所有预定义宏

clang -dM -E -x c /dev/null

结果如下

yexd@yexddeMacBook-Pro lesson_27_namespace % clang -dM -E -x c /dev/null
#define _LP64 1
#define __APPLE_CC__ 6000
#define __APPLE__ 1
#define __ATOMIC_ACQUIRE 2
#define __ATOMIC_ACQ_REL 4
#define __ATOMIC_CONSUME 1
......

查看用户自行设定的宏定义

gcc -dM -E helloworld.c

预宏定义在c++代码中的应用

#include "iostream"
using namespace std;

#if defined(_MSC_VER) // 如果是windows系统,引入direct.h,将 _getcwd 宏定义为 GetCurrentDir
    #include <direct.h>
    #define GetCurrentDir _getcwd
#elif defined(__unix__) || defined(__APPLE__) // 如果是unix系统或者苹果系统,引入unistd.h ,将 getcwd 宏定义为 GetCurrentDir
    #include <unistd.h>
    #define GetCurrentDir getcwd
#else
// 啥也不干
#endif

// 操作系统兼容,在不同的操作系统中获取当前文件目录的方法
std::string get_current_directory()
{
    char buff[250];
    // 如果是windows系统,就用 _getcwd,如果是mac系统就用 getcwd
    GetCurrentDir(buff, 250);
    string current_working_directory(buff);
    return current_working_directory;
}

int main(int argc, char* argv[])
{
    std::cout << "当前工作目录为: " << get_current_directory() << endl;
    return 0;
}

到此这篇关于查看C++ 预定义宏的方法的文章就介绍到这了,更多相关C++ 预定义宏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 深入探讨C++父类子类中虚函数的应用

    深入探讨C++父类子类中虚函数的应用

    本篇文章是对C++父类子类中虚函数的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言运算符的重载详解

    C语言运算符的重载详解

    这篇文章主要为大家详细介绍C语言运算符的重载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++中的循环引用

    C++中的循环引用

    虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧
    2017-09-09
  • C++中allocator类使用示例

    C++中allocator类使用示例

    大家好,本篇文章主要讲的是C++中allocator类使用示例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • VC++时钟函数

    VC++时钟函数

    VC中提供了很多关于时间操作的函数,编写程序时我们可以跟据定时的不同精度要求选择不同的时间函数来完成定时和计时操作
    2015-06-06
  • C++编程中私有和保护以及公有的类成员访问控制

    C++编程中私有和保护以及公有的类成员访问控制

    这篇文章主要介绍了C++编程中私有和保护以及公有的类成员访问控制,即private和protected以及public关键字的相关作用和用法,需要的朋友可以参考下
    2016-01-01
  • C++11系列学习之类型推导

    C++11系列学习之类型推导

    这篇文章主要介绍了C++11系列学习之类型推导,文章基于C++的相关资料展开对主题的详细内容介绍,具有一定的参考价值需要的小伙伴可参考一下
    2022-04-04
  • VSCode配置C/C++语言环境(2023最新版)

    VSCode配置C/C++语言环境(2023最新版)

    这篇文章主要介绍了VSCode配置C/C++语言环境(2023最新版)的全过程,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • 详解C语言fscanf函数读取文件教程及源码

    详解C语言fscanf函数读取文件教程及源码

    这篇文章主要为大家介绍了详解C语言算法fscanf读取文件示例教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • C语言读取BMP图像数据的源码

    C语言读取BMP图像数据的源码

    这篇文章主要介绍了C语言读取BMP图像数据的源码,需要的朋友可以参考下
    2013-03-03

最新评论