C++ – 使用宏区分不同系统平台、不同编译器、不同编译模式等编译期宏使用总结
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++ – 使用宏区分不同系统平台、不同编译器、不同编译模式等编译期宏使用总结
原文链接:https://www.stubbornhuang.com/1927/
发布于:2022年01月25日 13:12:18
修改于:2022年01月25日 13:12:53

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++ - 我在项目实际开发中用到的第三方库/开源项目,涵盖网络、加密解密、GUI、网络、音视频、图片等等 阅读30次,点赞0次
- C++STL容器 - std::vector构造方式与分配值方式总结 阅读579次,点赞0次
- C++ - 导出接口函数和导出C++类 阅读16次,点赞0次
- C++11 - 构建一个符合实际应用要求的线程池 阅读975次,点赞0次
- C++ - 将std::vector中的数值拷贝到数组中 阅读1784次,点赞1次
- C++ - std::numeric_limits
简介与使用,用于获取指定数据类型的最大值与最小值 阅读66次,点赞0次 - C++11/std::condition_variable - 生产者消费者模型 阅读2618次,点赞0次
- C++ - 函数返回多个返回值的方法总结 阅读1540次,点赞0次
- Windows - 使用类的成员函数作为Win32窗口消息回调处理函数WindowProc 阅读798次,点赞0次
- C++ - 只有在Debug模式下才使用std::cout输出调试日志,Release发布版本不输出调试日志 阅读3905次,点赞0次
全站随机文章推荐
- WordPress - 利用Revolvermaps在首页实时显示访客3D地球 阅读3113次,点赞1次
- Python - BeautifulSoup的find()和findAll() 阅读2608次,点赞0次
- FFmpeg - 关于ffmpeg avcodec_open2函数失败的问题 阅读3133次,点赞0次
- 工具推荐 - 推荐几个可以下载任意网站m3u8或者HLS流加密视频流的油猴脚本或者Chrome免费插件 阅读6122次,点赞3次
- Python - 解决opencv-python使用cv2.imread()读取中文路径图片失败的问题 阅读746次,点赞1次
- C++STL容器 – std::vector容器修改、元素操作总结 push_back,emplace_back,emplace,insert,erase,pop_back,clear,resize,swap 阅读807次,点赞1次
- UnrealEngine4 - 将FTexture2DRHIRef保存为图片 阅读3115次,点赞0次
- OpenCV/FFmpeg - 使用FFmpeg编码OpenCV中的BGR视频流为H264视频流以及解码H264视频流为OpenCV中的BGR视频流 阅读988次,点赞1次
- Duilib - 点击按钮弹出模态对话框 阅读1627次,点赞0次
- 资源分享 - Computational Geometry on Surfaces - Performing Computational Geometry on the Cylinder, the Sphere, the Torus, and the Cone 英文高清PDF下载 阅读1771次,点赞0次
评论
164