随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万

理解C++ 宏

1、什么是宏,它解决什么问题?

  宏的本质是文本替换,考虑下面的需求,程序中多次使用圆周率Pi,在每个地方都使用3.1415,显然很愚蠢。有没有好的办法呢?使用宏,如下:

  #define Pi 3.1415

  这样,编译器在程序中遇到Pi,就使用3.1415来进行文本替换。

2、特殊字符

  考虑下面的需求,程序中多处使用文本字符串。我们知道文本字符串前后都要加上双引号,我很讨厌输入双引号。有没有好的办法呢?根据常识,使用下面的宏:

  #define Str(x) "x"

  String s = Str(Hello); 期望预编译为:String s = "Hello",其实这是有问题的?仔细分析一下,宏的本质是文本替换。从编译器的角度思考,哪些地方应该换,哪些地方不应该换,并不是说遇到x就替换。也就是说,对于"x",编译器认为"x"是一个整体,其中的x不是Str(x)的x。因此,String s = "x"。那么如何解决这个问题呢?

  与此类似,相同道理的情况是转义字符。因此,这里也使用特殊字符。对宏变量前后加上双引号的特殊字符是:#。另外还有:

  #:宏变量前后加上双引号

  #@:宏变量前后加上单引号

  ##:进行拼接。

3、常用的宏

   __LINE__           宏在预编译时会替换成当前的行数
   __FUNCTION__      宏在预编译时会替换成当前的函数名称
   __FILE__           宏在预编译时会替换成当前的文件名
   __DATE__          编译的日期(格式"Mmm dd yyyy")
   __TIME__            编译的时间(格式"hh:mm:ss")
   __TIMESTAMP__    修改日期和时间,表示为以 Ddd Mmm Date hh:mm:ss yyyy 
   __STDC__             如果编译器接受标准C,那么值为1
   __VA_ARGS__          是一个可变参数的宏  

  其他见:http://msdn.microsoft.com/zh-cn/library/windowsphone/develop/b0084kay.aspx

4、尽量少使用宏,而应该使用替代方法。但是有些地方,还是必须要使用宏。比如:

  (#ifndef #define #endif)以及__LINE__等,为什么__LINE__也必须要使用宏?

  思考:使用宏,在当前位置进行文本替换,打印出来就是当前行数。如果使用方法,那么打印出来的就是方法中一行内容的行数。

posted on   Andy Niu  阅读(2126)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示