C++ – 使用宏区分不同系统平台、不同编译器、不同编译模式等编译期宏使用总结
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++ – 使用宏区分不同系统平台、不同编译器、不同编译模式等编译期宏使用总结
原文链接:https://www.stubbornhuang.com/1927/
发布于:2022年01月25日 13:12:18
修改于:2023年02月24日 10:36:52
1 区分不同系统平台
//-----------------------------
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
#ifdef _WIN64
// win64
#else
// win32
#endif
//-----------------------------
#elif __APPLE__
#include <TargetConditionals.h>
#if defined(TARGET_OS_OSX)
// macos
#elif TARGET_OS_IPHONE
// iphone
#else
// other APPLE os
#endif
//-----------------------------
#elif __ANDROID__
// android
//-----------------------------
#elif defined(linux) || defined(__linux)
// linux
//-----------------------------
#else
// other os
#endif
2 区分不同编译器
#if defined(__clang__)
/* Clang/LLVM. ---------------------------------------------- */
#elif defined(__ICC) || defined(__INTEL_COMPILER)
/* Intel ICC/ICPC. ------------------------------------------ */
#elif defined(__GNUC__) || defined(__GNUG__)
/* GNU GCC/G++. --------------------------------------------- */
#elif defined(__HP_cc) || defined(__HP_aCC)
/* Hewlett-Packard C/aC++. ---------------------------------- */
#elif defined(__IBMC__) || defined(__IBMCPP__)
/* IBM XL C/C++. -------------------------------------------- */
#elif defined(_MSC_VER)
/* Microsoft Visual Studio. --------------------------------- */
#elif defined(__PGI)
/* Portland Group PGCC/PGCPP. ------------------------------- */
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
/* Oracle Solaris Studio. ----------------------------------- */
#endif
3 区分C与C++代码
#ifdef __cplusplus
extern "C" {
#endif
void hello();
#ifdef __cplusplus
}
#endif
这样的代码几乎在每个开源库中都可能见到,主要的目的就是 C 和 C++ 混合编程,具体来说就是:
- 如果使用 gcc 来编译,那么宏
__cplusplus
将不存在,其中的extern "C"
将会被忽略; - 如果使用 g++ 来编译,那么宏
__cplusplus
就存在,其中的extern "C"
就发生作用,编译出来的函数名 hello 就不会被 g++ 编译器改写,因此就可以被 C 代码来调用;
4 区分Debug与Release编译模式
#ifdef _DEBUG
...
#else
...
#endif
5 内置预编译宏
__FILE__
:字符串,当前编译的源代码文件的文件名-
__DATA__
:字符串,当前编译日期 -
__TIME__
:字符串,格式是hh:mm:ss,当前编译时间 __FUNCTION__
:字符串,当前执行的函数名__LINE__
:十进制数,当前源代码文件的行数
当前分类随机文章推荐
- C++STL容器 - std::map容器修改、元素操作总结 clear,insert,emplace,erase,swap,merge,extract,insert_or_assign等 阅读1633次,点赞0次
- C++ - 使用C++标准库过滤Windows文件名中的非法字符 阅读4612次,点赞1次
- C++ - windows、linux跨平台递归创建多级目录 阅读199次,点赞0次
- C++11 - 构建一个符合实际应用要求的线程池 阅读1194次,点赞0次
- C++ - 阿拉伯数字字符串转换为中文读法的中文字符串,支持小数点 阅读1356次,点赞0次
- C++ - 导出接口函数和导出C++类 阅读396次,点赞0次
- C++ - 使用标准库实现事件和委托,信号和槽机制 阅读413次,点赞0次
- C++11 - 父类与子类相互包含的时候该如何正确的使用智能指针,防止循环引用 阅读2624次,点赞0次
- C++ - 字节数组byte[]或者unsigned char[]与double的相互转换 阅读2302次,点赞0次
- C++STL容器 - std::vector构造方式与分配值方式总结 阅读846次,点赞0次
全站随机文章推荐
- 资源分享 - Game Programming Gems 7 英文高清PDF下载 阅读3002次,点赞0次
- 资源分享 - Vulkan学习指南 , Learning Vulkan 中文版PDF下载 阅读1890次,点赞0次
- 深度学习 - 语音识别框架wenet中的CTC Prefix Beam Search算法的实现 阅读331次,点赞0次
- 资源分享 - C++并发编程实战(Anthony Williams著 中文译文版)PDF下载 阅读4034次,点赞1次
- 深度学习 - Python实现CTC Decode解码算法Greedy Search Decode,Beam Search Decode,Prefix Beam Search Decode 阅读1530次,点赞0次
- C++ - 获取std::vector中的最小值、最大值以及对应的索引 阅读237次,点赞0次
- 资源分享 - Image Objects - An Archaeology of Computer Graphics 英文高清PDF下载 阅读1826次,点赞1次
- 资源分享 - Speech and Language Processing - An Introduction to Natural Language Processing, Computational Linguistics, and Speech Recognition , Third Edition draft 英文高清PDF下载 阅读663次,点赞0次
- 资源分享 - High Dynamic Range Imaging- Acquisition, Display, and Image-Based Lighting ( First Edition )PDF下载 阅读2848次,点赞0次
- 资源分享 - The HDRI Handbook- High Dynamic Range Imaging for Photographers and CG Artists英文高清PDF下载 阅读2560次,点赞0次
评论
169