C++ 宏乘法是怎么回事

2023-12-13

#define MAX 265

std::cout << 0 * MAX << std::endl; //to my surprise, the output is 9 rather than 0

这个 C++ 宏乘法有什么问题?

EDIT:

以下是完整版本。

#include <stdio.h>
#include <string.h>
#include <iostream>

#define NAME_BYTES 256
#define VERSION_BYTES 256
#define SIZE_BYTES 32
#define USED_LOCK_COUNT_BYTES 32
#define LOCK_NAME_BYTES 256
#define LOCK_TYPE_BYTES 1
#define PID_BYTES 4
#define TID_BYTES 4
#define LOCK_BYTES LOCK_NAME_BYTES + LOCK_TYPE_BYTES + PID_BYTES + TID_BYTES 
#define HEADER_BYTES NAME_BYTES + VERSION_BYTES + SIZE_BYTES + USED_LOCK_COUNT_BYTES

int main() {
  std::cout << "LOCK_BYTES: " << LOCK_BYTES << std::endl;
  std::cout << "HEADER_BYTES: " << HEADER_BYTES << std::endl;
  std::cout << "LOCK_BYTES * 0: " << 0 * LOCK_BYTES << std::endl;
}

这是我刚刚得到的结果和编译器信息。

yifeng@yifeng-Precision-WorkStation-T3400:~/Shared-Memory-Solution/examples/IMPL$ g++ -v 使用内置规范。 COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6.1/lto-wrapper 目标:x86_64-linux-gnu 配置为:../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.1-9ubuntu3' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++, fortran,objc,obj-c ++,go --prefix = / usr --program-suffix = -4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir = / usr /lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with -sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-objc-gc --disable-werror --with-arch- 32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 线程模型:posix gcc 版本4.6.1(Ubuntu/Linaro 4.6.1-9ubuntu3)

yifeng@yifeng-Precision-WorkStation-T3400:~/Shared-Memory-Solution/examples/IMPL$ ./a.out LOCK_BYTES:265 HEADER_BYTES:576 LOCK_BYTES * 0:9

EDIT: 十分感谢大家!!我很高兴我决定发布这篇文章,尽管我收到了很多反对票。关于宏观,这是多么值得学习的一课啊!


您应该始终在宏定义两边加上括号:

#define LOCK_BYTES (LOCK_NAME_BYTES + LOCK_TYPE_BYTES + PID_BYTES + TID_BYTES)

否则,代码将扩展为:

cout << 0 * LOCK_NAME_BYTES + LOCK_TYPE_BYTES + PID_BYTES + TID_BYTES

其输出值LOCK_TYPE_BYTES + PID_BYTES + TID_BYTES.

更好的是,除非确实必要,否则不要使用宏。这些更好地表示为常量变量。

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

C++ 宏乘法是怎么回事 的相关文章

随机推荐

  • 在 JavaScript 中从下拉列表中获取多个值

    如何使用 JavaScript 函数获取下拉列表中选择的值 用户可以从两个元素中选择多个值 以下是我正在使用的元素 提前致谢
  • 如何将列表中的所有整数相乘[重复]

    这个问题在这里已经有答案了 你好 我想将列表中的整数相乘 例如 l 1 2 3 l 1 2 2 2 3 2 output l 2 4 6 所以我在网上搜索 大多数答案都是关于将所有整数相乘 例如 1 2 3 Try a 列表理解 l x 2
  • 如何在多个视图控制器中从最后一个视图控制器移动到第一个视图控制器

    嗨 我是 iPhone 编程新手 有人可以帮我吗 我有多个 viewController 在第一个名为 HomeViewController 的 ViewController 中 我调用了该方法 self presentModalViewC
  • 密码分页总结果计数

    我有一个巨大的密码查询 我需要对其结果进行分页 我想做的是在限制完成之前获取结果总数 这是我的测试图 http console neo4j org id 6hq9tj 我尝试使用count o 在查询的所有部分 但我总是得到相同的结果 总数
  • 无法在 android api 23 上打开位置?

    我使用了以下代码 请求许可的对话按预期显示 但当我点击 允许 时 它什么也没做 日志消息不会显示为好像未授予权限 因此我转到参数来验证位置是否为 打开 以及 关闭 难道不是因为我授予应用程序访问我的位置的权限而应该打开它吗 如果我手动 打开
  • 如何为维恩图准备 Pandas df

    我有一个 Pandas 数据框 如下所示 ID VALUE A Today A Yesterday B Tomorrow C Tomorrow D Today D Tomorrow E Today
  • 获取 XML 文档注释

  • 如何收听N个频道? (动态选择语句)

    要开始执行两个 goroutine 的无限循环 我可以使用下面的代码 收到消息后 它将启动一个新的 goroutine 并永远持续下去 c1 make chan string c2 make chan string go DoStuff c
  • Schema.org 在一页上设置多个事件

    是否有一种正确的方法可以在 Schema org 的一个页面上显示多个事件 理想情况下 我们不希望每个事件都有一个页面 这是我们想要的示例结构 div div h2 Chili Cookoff h2 div div h3 span Manh
  • 如何将 knockout.js 与 ASP.NET MVC ViewModel 结合使用?

    Bounty 已经有一段时间了 我仍然有几个悬而未决的问题 我希望通过增加赏金也许这些问题能够得到解答 如何将 html 助手与 knockout js 一起使用 为什么需要准备好文档才能使其正常工作 有关更多信息 请参阅第一次编辑 如果我
  • 使用 prolog 解决 Caliban 问题

    我正在努力使用学校的序言来解决逻辑难题 线索如下 布朗 克拉克 琼斯和史密斯是四位为他们的人民服务的重要公民 作为建筑师 银行家 医生和律师的社区 尽管不一定 分别 布朗比琼斯更保守 但比史密斯更自由 比比他年轻的人打高尔夫球更好 并且拥有
  • 通过重叠两个数据框,为每个组/id 创建子图

    我有以下两个数据框 Load the required libraries import pandas as pd import matplotlib pyplot as plt Create dataset 1 data set 1 id
  • 使用 Python 处理 XLSX 中的图像

    我有一个 xlsx 有两张表 一张在 G1 O25 中有一些数据 我们称之为 数据 一张在 G1 O25 的单元格中插入了一些图像 我们称之为 图像 我的目标是使用 Python 通过图像过滤数据 我想要一个弹出窗口 显示单元格 G1 中的
  • 在对象中声明函数名,为什么? [复制]

    这个问题在这里已经有答案了 正在研究一些 js 代码性能并看到了这种方法 window sample foo function foo a b code goes here bar function bar a b code goes he
  • support-library-v4 的依赖问题

    我想在 Eclipse 中导入 2 个现有项目作为库 这两个库项目都依赖于support library v4并有一个 jar 文件 因此 当我导入它们时 系统会要求我修复依赖项 我收到此错误 Jar mismatch Fix your d
  • 在类似 C 的语言中,空格是否被视为标记?

    空格是否被视为 C 类语言中的一种标记 尤其对 C 感兴趣 K R 中的参考手册对此似乎有点含糊 不 空格不会被视为令牌 从http c0x coding guidelines com 6 4 html 标准文本草案 不幸的是实际标准需要花
  • Fortran语言中的多态性

    我有一个类似的代码 Module C sys use class A implicit none Private Type public C sys type private logical Ao set false type A Ao C
  • 如何从用户控件处理页面事件? (VB.net)

    我希望在用户控件生命周期的 预加载 阶段执行一些代码 但是预加载事件仅适用于 Page 对象 因此 我将以下方法添加到我的用户控件中 Private Sub Page PreLoad ByVal sender As Object ByVal
  • 角度平移即时方法不起作用

    我们有一个带有角度翻译的网站 它工作完美 我们有一个变量 我们想用某种语言键来固定它 假设网站的语言有 en 和 zh 作为选项 我希望无论语言选择如何 某个翻译都以 zh 返回 通过浏览API参考 我找到了一种名为 Instant 的方法
  • C++ 宏乘法是怎么回事

    define MAX 265 std cout lt lt 0 MAX lt lt std endl to my surprise the output is 9 rather than 0 这个 C 宏乘法有什么问题 EDIT 以下是完整