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__
:十进制数,当前源代码文件的行数
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++ – 使用宏区分不同系统平台、不同编译器、不同编译模式等编译期宏使用总结
原文链接:https://www.stubbornhuang.com/1927/
发布于:2022年01月25日 13:12:18
修改于:2023年06月26日 20:46:30
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论
50