C/C++宏定义注意事项

news2024/10/5 18:29:51
  1. 宏定义后不能加“;”,如果想查找宏可能带来的bug,可以增加编译选项:/P,然后选择仅编译, 这时会生成*.i的文件,打开后可以看到编译器替换宏以后的实际内容,然后再去查看相关的替换有没有错误。

  1. 带参数的宏定义时必须在后边的定义中加(),防止自动分配优先级,造成错误理解

例如:#define pow(n) n * n

假如使用时传递pow(2),pow(5)都不会有问题,编译器会替换成2*2,5*5,但是如果调用时传递pow(2+3),编译器会替换成2 + 3 * 2 + 5 = 13,而我们期望得到5 * 5 = 25,明显是错误的。所以需要在定义时加上(),#define pow(n) (n) * (n),这时编译器会替换成 (2 + 3) * (2 + 3) = 25,会得到符合我们预期的数值。

  1. 整个表达式要加(),否则也会出现替换bug,比如 #define pow(n) (n) * (n) + 5,如果我们在调用时pow(3) * 10,这时编译器会替换为:(3) * (3) + 5 * 10,而不是我们预期的 (3 * 3 + 5) * 10,所以我们要定义为:#define pow(n) ((n) * (n) + 5)。

  1. 表达式宏定义规范:

例如:#define pow(n) ((n) * (n) + 5)

宏名称大写,单词之间用下划线分隔。

#define DEF_STRING(s) #s

char szTest[] = DEF_STRING(Test String); 等价于 char szTest[] = "Test String";

  1. 符号、状态,名称宏:

宏名称大写,单词之间用下划线分隔。

例如:#define PI 3.1415926

#define WRITED 0X000001

#define READED 0X000000

  1. 语句块宏:

宏名称大写,单词之间用下划线分隔。

#define SHOW_MSG(s) printf(s);printf("\r\n")

注意最后不要加";"

  1. 兼容性宏:

#define for if(1)for,可解决vc6.0 for循环定义迭代i的重复定义问题。

  1. 说明性宏

#define IN

#define OUT

void foo( IN int nCount, OUT int *pout)

只起到说明使用的作用,不做实际替换,因为替换后为空。

  1. 预处理宏, 条件编译

#define DEBUGED 1 //debug版本生效

#define DEBUGED 0 //非debug版本生效

调用:

int a = 10;

#if DEBUGED

a = b + c;

#endif

printf("\d", a);

或者

#define DEBUGED

使用:

#ifdef DEBUGED

a = b + c

#endif

10.编译选项宏, 条件编译

直接在IDE环境的预处理器中加入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/168766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

夏普MX-M2658N复印机显示请放入载体组件

故障描述: 一台夏普MX-M2658N复印机一开机就显示请放入载体组件,重新再次开机有可能不显示但是复印或打印的时候一定会卡纸,卡纸有时候卡在硒鼓附近或者加热组件的位置; 故障处理: 1、碳粉质量差; 2

fiddler的自动响应器_小实验

目录 一、小实验介绍 二、fiddler的自动响应器的应用 1.找对自动响应器的位置,添加规则 2.编辑规则,将这个请求用fiddler的内置响应; 3.编辑规则,将这个请求重定向到本地资源; 4.编辑响应 一、小实验介绍 承接上…

【自学Docker 】Docker ps命令

Docker ps命令 大纲 Docker ps命令概述 docker ps 命令可以用来列出 Docker容器 相关信息。 Docker ps命令语法 haicoder(www.haicoder.net)# docker ps [OPTIONS]Docker ps命令参数 选项说明无参默认显示正在运行的容器。-a显示所有的容器,包括未运行的。-f根…

[HCTF 2018]admin (三种解法详细详解)

目录 信息收集 思路一&#xff1a;弱口令爆破 思路2&#xff1a;垂直越权 代码审计 Unicode欺骗 Unicode 简介 伪造flask session 信息收集 注册登录 然后查看源码 <!-- you are not admin --> 看来需要伪造admin的身份 在changepassword页面查看源代码 <!-…

C++ 语法基础课8 —— STL/位运算和常用库函数

文章目录STL1. #include\<vector>(尾部增删)(1) 声明(2) size/empty(3) clear(4) 迭代器(iterator)(5) begin/end(遍历)(6) front/back(7) push_back()/pop_back()2. #include\<queue>(队列先进先出)(1) 声明(2) 循环队列 queue(队列结构)(3) 优先队列 priority_qu…

基于Python分析气象数据教程-1

前言本笔记介绍了如何使用 Python、pandas 和 SciPy 对天气数据进行基本分析。 它不包含对气象科学的贡献&#xff0c;但说明了如何生成简单的图和基本模型来拟合一些真实的物理观测。一、相关库引入import numpy import scipy.stats import pandas import matplotlib.pyplot a…

【零基础】学python数据结构与算法笔记13-贪心算法

文章目录前言80.贪心算法&#xff08;新一章&#xff1a;算法进阶&#xff09;81.分数背包82.分数背包实现83.数字拼接问题84.数字拼接问题实现85.活动选择问题86.活动选择问题实现87.贪心算法总结总结前言 学习python数据结构与算法&#xff0c;学习常用的算法&#xff0c; b…

LeetCode(Array)1656. Design an Ordered Stream

1. 问题 There is a stream of n (idKey, value) pairs arriving in an arbitrary order, where idKey is an integer between 1 and n and value is a string. No two pairs have the same id. Design a stream that returns the values in increasing order of their IDs b…

2023年网络安全比赛--网页渗透测试中职组(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.访问服务器网站目录1,根据页面信息完成条件,将页面中的flag提交; 2.访问服务器网站目录2,根据页面信息完成条件,将页面中的flag提交; 3.访问服务器网站目录3,根据页面信息完成条件,将页面中的flag提交; 4.访问服务器网…

【Java】流式编程学习笔记

文章目录一、流简介二、创建流2.1 由值创建流&#xff1a;of2.2 由列表创建流&#xff1a;stream2.3 由 Builder 创建流&#xff1a;build2.4 由文件生成流&#xff1a;lines2.5 由函数生成流2.5.1 迭代&#xff08;如果不做限制&#xff0c;就是创建无限流&#xff09;&#x…

线性结构之单链表详解

文章目录前言一.单链表的结构体二、单链表的基本接口1.SListMalloc&#xff08;申请节点&#xff09;2.SListPushBack&#xff08;尾插&#xff09;3.SListPushFront&#xff08;头插&#xff09;4.SListPopBack&#xff08;尾删&#xff09;5.SListPopFront&#xff08;头删&a…

0115 作用域,对象

作用域意义&#xff1a;一段代码中所用到的名字不总是有效可用的&#xff0c;限定这个名字的可用性代码范围全局作用域全局有效&#xff0c;作用所有代码局部作用域局部有效&#xff0c;作用于函数内的代码环境&#xff0c;和函数有关也称函数作用域块级作用域在大括号{}有效&a…

Docker中安装Centos

window版的docker 1.cmd拉取centos镜像 docker pull centos2.启动centos容器&#xff0c;并把docker上centos的22端口映射到本机50001端口(端口号可以自己指定) 3.进入到Centos容器 通过docker命令,查看当前存在的镜像或者容器 查看镜像: docker images查看容器: docker …

js如何实现随机数切换

前言在一些电商网站,或一些活动页上,看到一些特效,比如:抽奖时,点击图片,实现图片的随机切换,数字的随机切换等,为了吸引用户的注意力,增加网页的互动性,这个效果是怎么实现的呢01具体示例https://coder.itclan.cn/fontend/js/14-click-num-suiji/点击文末左下角阅读原文,即可查…

MySQL三大日志(binlog、redo log和undo log)详解

MySQL三大日志binlog、redo log和undo log详解1.redo logredo log概述刷盘时机innodb_flush_log_at_trx_commit0innodb_flush_log_at_trx_commit1innodb_flush_log_at_trx_commit2日志文件组2.binlogbinlog 概述记录格式写入机制刷盘时机3.两阶段提交4.undo log5.总结1.redo lo…

SSL和TLS协议如何提供身份验证、机密性和完整性

SSL 和 TLS 协议使两方能够相互识别和验证&#xff0c;并以机密性和数据完整性进行通信。SSL 和 TLS 协议通过 Internet 提供通信安全性&#xff0c;并允许客户端/服务器应用程序以保密和可靠的方式进行通信。这些协议有两层&#xff1a;记录协议和握手协议&#xff0c;它们位于…

要命!我篡改了系统命令惊现事故,竟要扣我年终奖-Golang-cobra

打工还是要打工的。。我最后也没发出去。 紧急处理以后&#xff0c;现在写复盘&#xff0c;大家随我看看我到底是在学习哪些内容。 &#xff08;以上内容纯属虚构&#xff0c;如有雷同纯属巧合&#xff09; 简介 之前我们讲过pflag和os.Args&#xff0c;现在说说cobra这个命令行…

如何将SQL Server数据从表导出到CSV文件

在本文中,我们将使用四种不同的工具将表从SQL Server导出到.csv文件。此外,你将学习如何将带有或不带有头的SQL查询结果导出到.csv文件。 SQL Server数据从表导出到CSV文件 使用SQL Server Management Studio将SQL结果导出到具有或不具有标题的CSV文件一、不带标题二、带标题…

图形编辑器:图形和辅助线绘制的坐标问题

大家好&#xff0c;我是前端西瓜哥。今天看看绘制图形和辅助线时&#xff0c;坐标转换的一些注意点。 项目地址&#xff0c;欢迎 star&#xff1a; https://github.com/F-star/suika 线上体验&#xff1a; https://blog.fstars.wang/app/suika/ 先回顾一下之前讲的视口坐标和场…

docker镜像与容器实践

一、引子 镜像和容器是不同的概念&#xff0c;本文主要是为了通过实践来强化对这两种不同概念的理解。 二、安装docker 安装docker&#xff0c;执行以下命令即可&#xff1a; # 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 设置国内源 yum-co…