C 宏有什么用?

2023-11-30

我写了一点C语言,我可以很好地阅读它,大致了解它在做什么,但每次我遇到宏时,它都会让我彻底崩溃。我最终不得不记住宏是什么,并在阅读时将其替换在我的脑海中。我遇到的那些直观且易于理解的总是像小迷你函数,所以我总是想知道为什么它们不仅仅是函数。

我可以理解需要在预处理器中为调试或跨平台构建定义不同的构建类型,但定义任意替换的能力似乎只会使本来就很困难的语言变得更加难以理解。

为什么要为 C 语言引入如此复杂的预处理器?有没有人有一个使用它的例子,让我明白为什么它似乎仍然被用于简单的 if #debug 风格条件编译以外的目的?

Edit:

读了很多答案我还是不明白。最常见的答案是内联代码。如果 inline 关键字不这样做,那么要么它有充分的理由不这样做,要么实现需要修复。我不明白为什么需要一个完全不同的机制,这意味着“真正内联此代码”(除了内联之前编写的代码之外)。我也不明白提到的“如果它太愚蠢而不能放入函数中”的想法。当然,任何接受输入并产生输出的代码最好放在函数中。我想我可能不明白,因为我不习惯编写 C 语言的微观优化,但预处理器感觉就像是一些简单问题的复杂解决方案。


我最终不得不记住宏是什么,并在阅读时将其替换在我的脑海中。

这似乎对宏的命名反映不佳。我假设你不必模拟预处理器,如果它是log_function_entry()宏。

我遇到的那些直观且易于理解的总是像小迷你函数,所以我总是想知道为什么它们不仅仅是函数。

通常它们应该是这样,除非它们需要对通用参数进行操作。

#define max(a,b) ((a)<(b)?(b):(a))

将适用于任何类型<操作员。

宏不仅仅是函数,还允许您使用源文件中的符号执行操作。这意味着您可以创建新的变量名称,或引用宏所在的源文件和行号。

在 C99 中,宏还允许您调用可变参数函数,例如printf

#define log_message(guard,format,...) \
   if (guard) printf("%s:%d: " format "\n", __FILE__, __LINE__,__VA_ARGS_);

log_message( foo == 7, "x %d", x)

其中格式的工作原理如下printf。如果守卫为真,它将输出消息以及打印该消息的文件和行号。如果它是一个函数调用,它不会知道您调用它的文件和行,并且使用vaprintf会多一点工作。

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

C 宏有什么用? 的相关文章

随机推荐

  • 我可以获得已安装我的 Tab 应用程序的主页列表吗?

    我曾多次看到类似的问题 但通常是人们试图找出哪个页面当前正在访问他们的选项卡应用程序 您可以通过检查signed request来做到这一点 我正在尝试构建一个 UI 向用户显示他 她是管理员的所有页面 然后显示其中哪些页面已经安装了我的选
  • 为什么 {key:value}["key"] 不起作用?

    1 key value key 2 key value key 我想知道 JS 解释器如何处理上面的代码 以及为什么1不起作用 为什么2 works 我假设您问这个问题是因为您在 JavaScript REPL shell 中看到了这种效果
  • 使用 Eloquent ORM / laravel 准备好的语句

    我是 Laravel 新手 并使用它作为输入查询 DB table user input gt insert array array fname gt Input get Name lname gt no email gt Input ge
  • Blackberry HttpConnection 超时

    在我的 Blackberry 4 5 项目中 我通过 Connector open 创建 HttpConnection 如果我通过 MDS 连接 我可以在 URL 的附加参数中指定 ConnectionTimeout 如果使用直接 TCP
  • .htaccess 重定向锚页面/page#anchor 到 url

    我如何重定向page page anchor to http www example com page page 我尝试了以下代码 但它不起作用 RewriteRule page page anchor http www example c
  • 在python中将多个png合并到一个pdf中

    我想知道是否有一种简单的方法可以在 python 中将多个 png 图像合并到一个 pdf 中 我希望每个图像都是 pdf 中的一页 pypdf 是为此使用的最佳库吗 任何帮助将不胜感激 Thanks from PIL import Ima
  • 将军事时间转换为标准时间(R 中的小时和分钟)

    我有以下一组时间数据 必须将其转换为 12 小时格式 814 830 1835 1730 1442 820 1430 930 1550 1725 1615 1010 1319 1755 820 1955 1850 710 例如 1300 下
  • 禁用Android图像自动旋转

    当我从图库中选择图像并在 ImageView 中显示图像时 某些图像会自动旋转 90 度 我如何禁用此功能 Code Override protected void onCreate Bundle savedInstanceState su
  • 如何在 C# 中将 XML 动态绑定到 WPF DataGrid

    我四处寻找这一点 但我能找到的所有示例都使用了 XAML 这使得解决方案过于静态 这是我想做的 我想从运行时指定的 XML 文件填充 DataGrid 的列 行和属性 DataGrid 的属性没有任何内容是可以修复的 XML 将其驱动到最后
  • 从长字符串中过滤数据(vcard)

    我正在扫描 vcard 二维码中的数据 我收到的字符串总是看起来像这样 BEGIN VCARD VERSION 2 1 N Lastname Firstname FN Firstname Lastname ORG Lol Group TIT
  • Selenium-TestNG-Maven - 获取“java.lang.NoClassDefFoundError:org/openqa/selenium/firefox/FirefoxDriver”

    这是我的第一个使用 TestNG 和 Maven 的 selenium 脚本 创建了一个简单的 Hello World 代码和一个仅检查谷歌页面标题的硒测试代码 下面是带有 TestNG 的 Selenium 代码 import org o
  • 路由错误 - 将 button_to 与自定义操作一起使用时没有路由匹配

    我有以下按钮来下载文件 button to download action download method get 我有一个downloadMoviesController 下的方法如下 movies controller rb def d
  • 使用正则表达式匹配 IRC 频道

    如何使用正则表达式来匹配 IRC 频道名称 这些名称将具有前面的哈希符号 包括 x07 x2C s 200 Should do it according to RFC1459 s specification
  • Hibernate DB 连接池 c3p0 出现问题

    自上一篇文章以来 我做了所有建议的更改 但这个问题仍然困扰着我 这是我得到的错误 Caused by com mysql jdbc exceptions jdbc4 CommunicationsException The last pack
  • Node Sass 找不到适合您当前环境的绑定

    我在构建应用程序时遇到问题 因为 node sass 不断因错误而失败 缺少绑定错误 Users warren Sites random docs my cms node modules node sass vendor darwin x6
  • 针对海量数据优化MySQL全外连接

    我们有以下 mysql 表 为了直奔主题而简化 CREATE TABLE MONTH RAW EVENTS idEvent int 11 unsigned NOT NULL city varchar 45 NOT NULL country
  • 使用shell脚本进行日志监控并发送邮件

    帮助写一个脚本 以下是日志格式 我想编写一个在实时日志中搜索关键字的脚本 假设有些服务器已停止 它将显示 shutdown 或force shutdown 并且它还在日志中显示 服务器关闭已由 user启动
  • Cassandra 将数据存储在哪个节点上?

    是否有命令或任何方式可以知道哪些数据存储在 Cassandra 的哪些节点上 我对 Cassandra 还很陌生 在谷歌上搜索这个问题的运气不佳 Thanks 您可以让 Cassandra 告诉您特定键所在的节点节点工具获取端点 nodet
  • Java:获取最大公约数,哪种方法更好?

    从这个问题Java 获取最大公约数 在获取任意数据类型的gcd时是否int long Integer Long 哪个答案在精度 速度 CPU 使用率等方面更好 A private static int gcdThing int a int
  • C 宏有什么用?

    我写了一点C语言 我可以很好地阅读它 大致了解它在做什么 但每次我遇到宏时 它都会让我彻底崩溃 我最终不得不记住宏是什么 并在阅读时将其替换在我的脑海中 我遇到的那些直观且易于理解的总是像小迷你函数 所以我总是想知道为什么它们不仅仅是函数