《学习C++》基本概念之预定义宏(c 预定义)

《学习C++》基本概念之预定义宏(c 预定义)

编码文章call10242025-08-03 1:03:345A+A-

在每一个TU中,有一些宏名已被预先定义好,称为预定义宏(Predefined Macro)。这些宏如果出现在代码中,将在预编译阶段展开。

__cplusplus

展开为一个整型常量值,用于表示当前使用的C++标准的版本号。如果未定义,则代表当前为C语言编译环境。

__cplusplus值

对应的C++版本

199711L

C++98

C++03

201103L

C++11

201402L

C++14

201703L

C++17

202002L

C++20

202302L

C++23

结合条件编译,可以根据当前的C++版本选择不同的代码执行,用于编写跨版本、跨语言兼容代码。

  • 以下代码可以同时支持C/C++编译,即一套代码可同时为两种语言提供接口声明。
#ifdef __cplusplus
    extern "C" {  // 告诉 C++ 编译器以 C 方式链接
#endif
    // 兼容 C 的代码(如头文件声明)
#ifdef __cplusplus
    }
#endif
  • 以下代码根据C++版本,选择不同的头文件。
#if __cplusplus >= 201703L
    // C++17 或更高版本的代码
    #include <filesystem>
    namespace fs = std::filesystem;
#elif __cplusplus >= 201103L
    // C++11/C++14 的备用代码
    #include <experimental/filesystem>
    namespace fs = std::experimental::filesystem;
#else
    #error "This code requires C++11 or later!"
#endif

__FILE__、__LINE__、__DATE__、__TIME__

分别展开为当前文件名(字符串常量)、当前代码行号(整型常量)、当前编译日期(字符串常量,格式为“Mmm dd yyyy”)、当前编译时间(字符串常量,格式为“hh:mm:ss”)。

这些宏主要用于错误日志输出,有助于调试定位。

__STDC_HOSTED__

C++11引入的预定义宏,展开为整数常量,表示C++的运行环境。1表示托管环境(hosted,即运行在操作系统之上,可以使用标准库;0表示独立环境(freestanding即无操作系统的环境(如嵌入式系统、内核开发等),通常只能使用语言核心功能,标准库支持有限

结合条件编译,可以使一套代码同时支持普通操作系统环境以及嵌入式(或内核)环境。

#if !__STDC_HOSTED__
    // 独立环境下必须自行实现基本函数
    void* memcpy(void* dest, const void* src, size_t n) {
        char* d = (char*)dest;
        const char* s = (const char*)src;
        while (n--) *d++ = *s++;
        return dest;
    }
#else
	#include <string.h> // 使用标准库的 memcpy
#endif
点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4