首页 > 编程语言 >C++中预定义宏

C++中预定义宏

时间:2024-12-23 20:56:20浏览次数:5  
标签:__ std cout 示例 C++ 编译 预定 义宏

C++中有许多预定义宏,这些宏在程序编译时由编译器自动定义,并可以在代码中使用。预定义宏通常用于调试、条件编译、文件信息、平台特定配置等方面。以下是一些常见的预定义宏及其具体使用方法和示例。

1. __FILE__

说明__FILE__ 是一个字符串宏,表示当前源代码文件的名称(包括路径)。

使用方法:通常用于调试或日志记录,以显示当前文件的名称。

示例

#include <iostream>

int main() {
    std::cout << "This code is in file: " << __FILE__ << std::endl;
    return 0;
}

输出

This code is in file: /path/to/your/sourcefile.cpp

2. __LINE__

说明__LINE__ 是一个整数宏,表示当前源代码的行号。

使用方法:常用于调试或错误报告,帮助开发者快速定位问题发生的源代码行号。

示例

#include <iostream>

int main() {
    std::cout << "This is line: " << __LINE__ << std::endl;
    return 0;
}

输出

This is line: 6

3. __DATE__

说明__DATE__ 是一个字符串宏,表示编译源代码时的日期(格式:Mmm dd yyyy,例如:Sep 3 2024)。

使用方法:可以用于生成代码的编译日期,常见于版本控制和构建信息。

示例

#include <iostream>

int main() {
    std::cout << "Compiled on: " << __DATE__ << std::endl;
    return 0;
}

输出

Compiled on: Sep  3 2024

4. __TIME__

说明__TIME__ 是一个字符串宏,表示编译源代码时的时间(格式:hh:mm:ss,例如:14:30:15)。

使用方法:用于记录代码编译的时间,通常在日志或调试输出中使用。

示例

#include <iostream>

int main() {
    std::cout << "Compiled at: " << __TIME__ << std::endl;
    return 0;
}

输出

Compiled at: 14:30:15

5. __STDC__

说明__STDC__ 是一个宏,当代码是严格符合标准的 C 语言程序时(即不使用任何扩展),这个宏会被定义。对于 C++ 编译器,它表示是否遵循 C 标准。

使用方法:主要用于条件编译,确定是否使用标准 C 语言的一些特性。

示例

#include <iostream>

int main() {
#ifdef __STDC__
    std::cout << "The program is compiled with a standard C compiler!" << std::endl;
#else
    std::cout << "The program is compiled with a non-standard compiler!" << std::endl;
#endif
    return 0;
}

输出

The program is compiled with a standard C compiler!

6. __cplusplus

说明__cplusplus 是一个宏,用于表示当前编译环境支持的 C++ 标准版本。它的值是一个整数,代表 C++ 标准的年份和修订版本。

常见值

  • 199711L:C++98。
  • 201103L:C++11。
  • 201402L:C++14。
  • 201703L:C++17。
  • 202002L:C++20。

使用方法:通常用于判断当前编译环境使用的 C++ 标准版本。

示例

#include <iostream>

int main() {
#if __cplusplus == 199711L
    std::cout << "C++98 Standard" << std::endl;
#elif __cplusplus == 201103L
    std::cout << "C++11 Standard" << std::endl;
#elif __cplusplus == 201402L
    std::cout << "C++14 Standard" << std::endl;
#elif __cplusplus == 201703L
    std::cout << "C++17 Standard" << std::endl;
#elif __cplusplus == 202002L
    std::cout << "C++20 Standard" << std::endl;
#else
    std::cout << "Unknown C++ Standard" << std::endl;
#endif
    return 0;
}

输出

C++17 Standard

7. __GNUC__, __GNUG__

说明__GNUC____GNUG__ 是 GNU 编译器(GCC)所定义的宏。__GNUC__ 表示 GCC 的主版本号,__GNUG__ 用于判断是否是 GNU C++ 编译器。

使用方法:通常用于平台特定的编译选项或特性,以判断是否在 GCC 编译器下编译代码。

示例

#include <iostream>

int main() {
#ifdef __GNUC__
    std::cout << "Compiled with GCC, version " << __GNUC__ << "." << __GNUC_MINOR__ << std::endl;
#endif
    return 0;
}

输出

Compiled with GCC, version 10.2

8. __declspec (Microsoft特定)

说明__declspec 是 Microsoft 编译器特有的一个关键字,用于指定函数、变量或类型的属性。例如,用于声明 DLL 导入或导出符号。

使用方法:在 Windows 编程中常用于定义函数的导入导出。

示例

#include <iostream>

__declspec(dllexport) void hello() {
    std::cout << "Hello, world!" << std::endl;
}

int main() {
    hello();
    return 0;
}

说明

  • __declspec(dllexport) 是 Microsoft 的扩展,用来声明函数为 DLL 的导出函数。

9. __VA_ARGS__

说明__VA_ARGS__ 是用于宏定义中的可变参数的宏,它代表宏调用时传递给宏的所有额外参数。

使用方法:常用于实现日志记录、调试信息等功能,可以支持可变参数宏。

示例

#include <iostream>

#define LOG(msg, ...) std::cout << "LOG: " << msg << __VA_ARGS__ << std::endl

int main() {
    LOG("Error: ", "File not found\n");
    return 0;
}

输出

LOG: Error: File not found

10. #ifdef / #ifndef / #endif

这些并非直接的预定义宏,但它们与预定义宏结合使用来控制条件编译:

示例

#include <iostream>

#define DEBUG

int main() {
#ifdef DEBUG
    std::cout << "Debug mode is enabled." << std::endl;
#else
    std::cout << "Debug mode is disabled." << std::endl;
#endif
    return 0;
}

输出

Debug mode is enabled.

总结

  • 这些预定义宏提供了关于文件、日期、时间、编译器、标准版本等的信息,并常用于调试、日志记录和条件编译。
  • 它们在跨平台开发、库开发和调试中尤为重要,帮助开发者在不同环境下编写更具可移植性的代码。

标签:__,std,cout,示例,C++,编译,预定,义宏
From: https://blog.csdn.net/pumpkin84514/article/details/144655956

相关文章

  • 【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【
    目录......
  • C++STL--迭代器
    本文章粗浅的介绍了什么是迭代器,帮助小伙伴们理解!!!文章目录一、迭代器是什么?二、使用迭代器三、begin和end的运算四、结合解引用和成员访问五、迭代器的运算六、迭代编程思想总结一、迭代器是什么?迭代器(iterator)是一种设计模式,在编程中广泛用于遍历(迭代)集合(......
  • C++STL----Vector容器
    本文章简单的介绍了STL中的vector容器以及vector容器的一些常见的用法。文章目录一、Vector是什么?二、Vector的定义初始化三、Vector的数据插入四、Vector的使用归纳总结一、Vector是什么?vector表示对象的集合vector本身其实是模板vector不是一个单独的类型,而是C......
  • C++----类与对象(下篇)
    再谈构造函数回顾函数体内赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。classDate{public: Date(intyear,intmonth,intday){ _year=year; _month=month; _day=day; }private: int_year; int_month;......
  • 南海区2021年C++甲组真题第2题——多多的作业
    题目描述多多刚做完了“100以内数的加减法”这部分的作业,请你帮他检查一下多多算得对不对。每道题目(包括答案)的格式为a+b=c或者a–b=c,其中a和b是作业中给出的,均为不超过100的非负整数;c是多多算出的答案,是不超过200的非负整数;且每个符号间有一个空格,即‘+’的前后各有......
  • 某狐畅游24校招-C++开发岗笔试
    某狐畅游24校招-C++开发岗笔试目录某狐畅游24校招-C++开发岗笔试一、单选题二、单选题解析本文题目源来自:[PTA程序设计类实验辅助教学平台](PTA|程序设计类实验辅助教学平台)一、单选题1-1若有说明inta[2][3];则对a数组元素的正确引用是A.a[0][1+1]B.a[1][3]......
  • C++ 定时器,时间轮算法
    C++实现定时器的两种方法(线程定时和时间轮算法修改版)_c++定时器-CSDN博客 #include<chrono>#include<functional>#include<list>#include<mutex>#include<thread>#include<vector>classTimerWheel{public:usingTask=std::function<......
  • 少儿C++编程、信奥(GESP、CSP-J等)入门书籍推荐
    选择标准1、要有对应的OJ题库2、有相关的PPT课件3、有相关的视频1、《信息学奥赛一本通编程启蒙C++版》董永建(2024-06-01)合集·信奥一本通c++启蒙版480题通关秘籍,全网最全教程!逻思叮编程的个人空间-逻思叮编程个人主页-哔哩哔哩视频合集·信息学奥赛一本通......
  • 与程序设计有关的网址收藏C/C++(CodeBlocks/wxWidgets)、Pascal(Lazarus/Delphi/LCL/FCL)
    0.前言在网上查看资料的时候,经常会看到一些好的文章,这些文章介绍的知识点可能是当时使用的,也可能是以后能用得着的。对于那些以后能用得着的知识点,有时在用到的时候在想找却忘记了是在哪一篇文章里了,或者再搜索却搜索不到了。通常遇到以后可能需要的文章,最好的办法是收藏。可是......
  • C++ vector:代码舞台上伸缩自如的数据精灵舞链
    一、C++ vector 容器介绍1.STL容器概览C++STL涵盖多种容器,分顺序容器如(vector)与关联容器(如 map、set)。vector作为常用顺序容器,是动态数组,运行时可自动扩容量且随机访问高效。2.选用vector缘由动态伸缩:对比C风格数组大小固定,vector能自动管理内存,按需调整大......