奇怪的宏定义问题

2024-04-06

我想在编译时根据另一个宏的值定义一个宏。但是这段代码没有按预期执行:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIXTEEN 16
#define TWO (SIXTEEN % 8 == 0)? (SIXTEEN / 8) : ((SIXTEEN / 8) + 1)

int main();

int main() {
    printf("max = %d\n", TWO);
    int i;
    for (i = 0; i < TWO; i++) {
        printf("%d\n", i);
    }
    return 0;
}

这打印:

max = 2
0
1
2
...

并继续直到终止,此时应该简单地打印:

max = 2
0
1

并退出。

如果我这样做,它会起作用:

#define TWO 2

我认为这是宏定义的问题...但是,如果我对原始的 #define 执行以下操作,它似乎可以工作:

...
int count = TWO;
for (i = 0; i < count; i++) {
...

谁能解释一下这是怎么回事?


问题是令牌TWO被替换为您定义宏的标记,因此:

i < TWO

变成这样:

i < (SIXTEEN % 8 == 0)? (SIXTEEN / 8) : ((SIXTEEN / 8) + 1) 

由于运算符优先级,这被读作:

(i < (SIXTEEN % 8 == 0))
    ? (SIXTEEN / 8) 
    : ((SIXTEEN / 8) + 1) 

您需要额外的括号,以便当TWO被替换列表替换,你会得到你想要的结果:

#define TWO ((SIXTEEN % 8 == 0)? (SIXTEEN / 8) : ((SIXTEEN / 8) + 1))
            ^                                                       ^

使用宏时,最好尽可能使用括号,以确保结果符合您的预期。

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

奇怪的宏定义问题 的相关文章

随机推荐

  • invokedynamic 什么时候真正有用(除了惰性常量之外)?

    TL DR 请提供一段用一些众所周知的动态语言 例如 JavaScript 编写的代码 以及该代码在使用 invokedynamic 的 Java 字节码中的样子 并解释为什么使用 invokedynamic 是一个进步 背景 我在 goo
  • 如何对 axios 响应拦截器进行自定义错误代码检查?

    我在我的应用程序中使用 graphql 它错误地发送以下响应 您可能已经注意到 graphql 将所有错误作为状态代码 200 发送 我从 API 返回的错误位于data errors data errors message Error T
  • 剃刀组件中的 C# StateHasChanged() 不会强制

    我正在尝试服务器端 blazor 我正在尝试使用多个按钮设置 更改在剃刀组件的标签中播放的 mp4 文件 我发现实现这项工作的唯一方法是通过 IJSRuntime InvokeVoidAsync 从我的 razor 组件中的 OnParam
  • Webpack 图像文件夹

    我对 webpack 还很陌生 当我部署时我基本上得到了JS文件和一堆在同一文件夹中像这样乱码的图像 我愿意为此not即将发生 我想让图像文件保留它们的名称 因为在我的 javascript 中 我想动态加载图像文件以及资源文件中的其他内容
  • 在威特的最后...Javascript不会取代'\n'!

    我已经研究这个问题好几个小时了 但运气为零 不知道这怎么可能 我会尝试总结一下 我正在使用 TinyMCE 将新内容插入数据库 该内容在插入数据库后作为 AJAX 响应发送回 然后显示在页面上 替换一些旧内容 所有这些都与问题无关 据我所知
  • 如何在父 DIV 容器中移动 DIV 并调整其大小而不溢出?

    let isSelecting false let selectionStartX selectionStartY selectionEndX selectionEndY let selectionRectangle let dragged
  • iphone:(音频)发布消息以杀死 mediaserverd

    我正在使用以下方法播放几种声音 音频服务 https developer apple com library mac documentation AudioToolbox Reference SystemSoundServicesRefer
  • 如何在VB.net中读取PDF文件或在VB.net中将PDF转换为word文档

    我需要使用 VB net 编写的应用程序阅读 PDF 中的文本 目前最好的方法是什么 我也愿意先将 PDF 转换为 Word 文档 然后阅读 iTextPdf 看起来是一个很好的起点 开源和 C 所以任何示例都应该可以移植到 vb net
  • 如何以编程方式接收超过 10 条亚马逊 SQS 消息

    我们有 SQS 标准消息队列 并且它的增长速度非常快 大多数时候我们都会收到旧的通知 我们已将消息保留期配置为 2 天 有没有办法以编程方式接收超过 10 条消息 以下是我从亚马逊恢复 SQS 消息的代码 private IEnumerab
  • 反斜杠零分隔符 '\0'

    我见过 0 用作混合二进制文件 UTF8 字符串 二进制数据 中的分隔符 谁能解释一下什么 0 意味着或指向一个好的学习场所 这是空字符 更多信息请参见此维基百科article http en wikipedia org wiki Null
  • 重置页面上的所有复选框而不循环

    我想知道是否可以在不使用 jQuery 循环的情况下重置页面上的所有复选框 将它们标记为未选中 您可以使用单个选择器查找所有选中的复选框 并从中删除 checked 属性 jQuery 将通过循环在内部完成此操作 但您不必自己编写循环 ch
  • Javascript -Uncaught 承诺被拒绝,即使它已经被拒绝

    我正在运行这个 Parse com 云代码作业 它查询我的一个类并获取 url 然后我读取这些 url 它们是 xml 文件 然后从其中获取一些数据并将其保存以进行解析 从代码中可以看出 这是代码 完整代码在这里gist github co
  • 使用提交更新 docker 镜像并进行小的更改

    我想利用 Docker 镜像的缓存 分层来节省带宽 磁盘空间和时间 Let say 我安装了一个 Web 应用程序 docker 映像并将其部署到多个 docker 主机中 docker 镜像包含我的网络应用程序的源代码 我编写了代码 现在
  • 哈希表插入失败。负载系数太高。 - ASP.NET 4.0 MVC3

    我们有一个在 F5 负载平衡服务器上运行的 ASP NET 4 0 MVC3 应用程序 我们收到了下面的异常 我们不在 Web 应用程序中执行多线程 但不知道 F5 负载平衡服务器是否可以考虑到该等式中 我们看到早期版本的 NET 中发生异
  • 为什么 Java Map 对 get 和 remove 方法采用无类型参数?

    我在代码中遇到了一个错误 我使用了错误的密钥从 Java 映射中获取一些我认为是使用 Java 泛型强类型的内容 查看 Map Javadocs 时 许多方法 包括 get 和 remove 都采用对象作为参数 而不是类型 K 对于定义为
  • .net 消息循环

    谁能帮我解释一下如何与 WPF 中的消息循环交互 我知道如何开始使用 System Windows Threading Dispatcher Run 现在 我只需要一种调用它的方法 我有一个 while 循环 我想在消息循环中处理消息 wh
  • WordPress 5.2 YouTube 视频在帖子中自动嵌入功能不起作用

    在我的个人 WordPress 博客 5 2 中 视频自动嵌入功能不起作用 编辑器会显示一个微调框 非常简短 但随后它会在后端显示视频链接 并在前端以纯文本形式显示 URL 我尝试过在不同的浏览器中更改帖子 全部失败 我尝试了不同的视频 有
  • 声明和原型的区别

    C 中的声明和原型有什么区别 在哪些情况下它们被称为声明以及原型 TL DR 所有原型都是声明 但并非所有声明都是原型 宣言是标准中使用的通用术语 原型更具体 Quoting C11 第 6 7 章 声明指定一组标识符的解释和属性 并从 6
  • 在流操作中使用方法引用和函数对象之间的区别?

    使用 Java 8 流时 我经常发现需要重构多语句 lambda 表达式 我将用一个简单的例子来说明这一点 假设我已经开始编写这段代码 Stream of 1 3 map i gt if i 1 return I else if i 3 r
  • 奇怪的宏定义问题

    我想在编译时根据另一个宏的值定义一个宏 但是这段代码没有按预期执行 include