预处理器宏有什么用?

2023-12-22

在阅读了另一个有关宏使用的问题后,我想知道:什么are他们有什么好处?

我认为不会很快被任何其他语言结构取代的一件事是减少您需要输入以下内容的相关单词的数量:

void log_type( const bool value ) { std::cout << "bool: " << value; }
void log_type( const int value ) { std::cout << "int: " << value; }
...
void log_type( const char  value ) { std::cout << "char: "  << value; }
void log_type( const double  value ) { std::cout << "int: "  << value; }
void log_type( const float  value ) { std::cout << "float: "  << value; }

相对于

#define LOGFN( T ) void log_type( const T value ) { std::cout << #T ## ": " << value; }
LOGFN( int )
LOGFN( bool )
...
LOGFN( char )
LOGFN( double )
LOGFN( float )

还有其他“不可替代”吗?

编辑: 试图总结答案中遇到的原因-为什么;因为这就是我感兴趣的。主要是因为我有一种感觉,其中大多数是由于我们仍然在支持很差的环境中使用原始文本文件进行编程。

  • 待编译代码的灵活性(例如#ifdef DEBUG、平台问题)(SadSido、Catalin、Goz)
  • 调试目的(例如__LINE__, __TIME__);我还将“字符串化”放在这个原因下(SadSido,Jla3ep,Jason S)
  • 替换例如PHP 的require vs. include特征 (#pragma once)(萨德西多,卡塔林)
  • 通过替换复杂的代码(例如MESSAGEMAP, BOOST_FOREACH)(SadSido,fnieto)
  • DRY 原则 (Jason S)
  • 内联替代品(Matthias Wandel、Robert S. Barnes)
  • 字符串化 (Jason S)

  • 在不同条件下编译不同的代码(#ifdef __DEBUG__ );
  • 保护每个翻译单元包含每个标头一次(#pragma once );
  • __FILE__ and __LINE__- 替换为当前文件名和当前行;
  • 构建代码以使其更具可读性(例如:BEGIN_MESSAGE_MAP() );

请参阅此处的 gotw 中有趣的宏讨论:

http://www.gotw.ca/gotw/032.htm http://www.gotw.ca/gotw/032.htm

http://www.gotw.ca/gotw/077.htm http://www.gotw.ca/gotw/077.htm

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

预处理器宏有什么用? 的相关文章

  • 以相反的顺序迭代可变参数模板参数

    如果我手动反转传递给它的模板参数的顺序 以下代码将起作用 template
  • 必须打开存储才能执行此操作 - System.IO.Packaging.Package

    我正在使用 System IO Packaing Package 类来压缩文件 我的应用程序的多个实例可以同时运行 并读取和保存文件 当处理小文件时 一切似乎都很好 但是当涉及大文件时 如果应用程序的两个实例同时保存 我会收到一个异常 消息
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 没有 Unicode 字节顺序标记。无法切换到 Unicode

    我正在使用 XSD 编写 XML 验证器 下面是我所做的 但是当验证器到达该线时while list Read 它给了我错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 有人可以帮我解决吗 public class Va
  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • 特定设备的不同字体大小

    我目前正在开发通用应用程序 我需要分别处理移动设备和桌面的文本框字体大小 我找到了一些方法 但都不能解决问题 使用 VisualStateManager 和 StateTrigger 为例
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 不要声明只读可变引用类型 - 为什么不呢?

    我一直在阅读这个问题 https stackoverflow com questions 2274412 immutable readonly reference types fxcop violation do not declare r
  • 从包含大量文件的目录中检索文件

    我的目录包含近 14 000 000 个 wav 格式的音频样本 所有普通存储 没有子目录 我想循环浏览文件 但是当我使用DirectoryInfo GetFiles 在该文件夹上 整个应用程序冻结了几分钟 可以用另一种方式完成吗 也许读取
  • 为什么WCF中不允许方法重载?

    假设这是一个ServiceContract ServiceContract public interface MyService OperationContract int Sum int x int y OperationContract
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面
  • 程序退出后,TcpListener Socket 仍处于活动状态

    当我的程序退出时 我试图停止 TCP 侦听器 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码本质上是 try myServer Server Shutdown SocketShutdown Both catch E
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源

随机推荐

  • 如何按自定义字段日期排序 WordPress 帖子?

    我正在制作一个事件侧边栏部分 仅显示接下来的 3 个事件 我已经让自定义帖子类型和自定义字段全部正常工作 但我似乎可以弄清楚如何按事件的开始日期 这是自定义字段值 对帖子进行排序 有没有一个php函数可以比较日期并将它们组织成一定的顺序 我
  • MeteorJS MongoDB 部署错误

    由于某种原因 当我使用 Meteor 部署时 我的服务器出现以下错误 并且我无法访问这些页面 我遇到以下错误 警告错误 没有可用于查询的副本集主副本 读取首选项主要 我正在使用 Meteor 1 1 0 2 并运行meteor deploy
  • RGB 字节与 HSL 之间的转换?

    有没有RGB转换的算法byte数组到 HSLfloat阵列并再次返回 我已经尝试过找到的那个here https stackoverflow com questions 8838264但它似乎有错误 我使用以下类从 HSL 转换为 RGB
  • 可视化嵌套的 JSON 结构

    考虑这个 JSON 对象 department 1 id 1 name Joe Smith email email protected cdn cgi l email protection id 500 name Bun Sam email
  • 从 using 块内的异常中检测 Dispose()

    我的应用程序中有以下代码 using var database new Database var poll Some database query code foreach Question question in poll Questio
  • 将 Javascript 函数作为参数传递给 C++ 函数

    我用 C 声明我的对象 class Action public QObject Q OBJECT Q PROPERTY QString name READ name public Action QObject 0 QString name
  • Libc共享库如何加载到内存中并在进程之间共享?

    我想了解Libc共享库如何加载到内存中并在进程之间共享 是否有一个 libc 实例加载到内存中并在所有进程之间共享 或者是每个进程的内存中的每个 libc 实例 我不清楚 libc 如何在进程之间共享 谢谢 阿迪亚 libc 的一个实例在所
  • 假镜子。你能帮我解决吗?

    这里是 BFG 9000 每次射击都会摧毁三个相邻的阳台 第 N 个阳台毗邻 第一个 射击后 生存怪物对列昂尼德造成伤害 小说的主要英雄 每个怪物一个单位 进一步后续新拍摄等 直到所有怪物 将会灭亡 需要定义最小损坏量 这可以带走列昂尼德
  • 在 Unity App.Config 文件中包含通用类

    我有一类类型ISimpleCache
  • 从已部署的 Azure 应用服务中提取 MachineKey

    我有一个 ASP NET 4 6 Web API 服务作为 Azure 应用服务在单个区域的单个应用服务计划中运行 我们正在修改此服务 使其部署在多个区域 并在前面有一个负载均衡器 每个区域都有自己的应用服务计划 因此 我们需要确保在每个应
  • API 或代码:Hibernate 3 和 4 之间的区别?

    我已经粘贴了休眠3配置文件 SessionFactory 类来配置此 config xml 和带有 JPA 注释的 bean 我想知道我是否在使用休眠4那么代码级别的上下文会发生什么变化 或者外行语言的非常广泛的差异或进步 休眠配置文件
  • Matlab:将全局坐标转换为图形坐标

    如果我通过获取坐标 coords get 0 PointerLocation 我怎样才能将它们转换为通过获得的积分ginput 即我想从中获得相同的值 coords get 0 PointerLocation coords someConv
  • 使用 declarative_base 派生对象的 alembic create_table

    我有一个 Alchemy ORM 对象 from sqlalchemy ext declarative import declarative base Base declarative base class MyORM Base id Co
  • Morningstar 用 python 请求获取 10 年的财务数据

    看来晨星登录解决方案在不使用selenium等无头浏览器 如何登录morningstar com https stackoverflow com questions 48228739 how can i log in to mornings
  • R 中依赖非标准评估的函数的包装器

    我写了一个包装ftable因为我需要计算许多变量的频率和百分比的平面表 mytable lt function tab lt ftable exclude NULL prop lt prop table x tab margin 2 100
  • 为什么composite-id类必须实现Serialized?

    如果我创建一个复合 id 类 它不实现 Serialized 如下所示 Entity Table name board public class Board Id Column name keyword news id private in
  • 在 Protractor 测试中访问 Angular

    是否可以像在单元测试中一样在量角器测试中访问角度 用例是我有一个转换文本的服务 我想访问该服务以转换实际测试脚本中的一些数据 我知道有addMockModule量角器中的方法 但我不知道如何将它用于此目的 将不胜感激任何帮助 有一个函数叫做
  • 用遗传算法建立排名,

    BIG 版本后的问题 我需要使用遗传算法建立排名 我有这样的数据 P a gt b 0 9 P b gt c 0 7 P c gt d 0 8 P b gt d 0 3 现在 让我们解释一下a b c d作为足球队的名称 以及P x gt
  • 如何在 jupyter/ipython 笔记本中显示图形旁边的文本段落

    我正在寻找一种 也许是创造性的 方法将文本放置在 jupyter 笔记本中的图表旁边 这个想法是在图表旁边有一个详细的描述 而不是笔记本通常的垂直流程 有任何想法吗 一种相当有创意的方法是模仿内联后端但添加基础表 python 2 7 的可
  • 预处理器宏有什么用?

    在阅读了另一个有关宏使用的问题后 我想知道 什么are他们有什么好处 我认为不会很快被任何其他语言结构取代的一件事是减少您需要输入以下内容的相关单词的数量 void log type const bool value std cout lt