对于定义为 0 的宏,#ifdef 和 #if 之间的细微差别

2024-03-08

给定以下 C 文件:

$ cat macros.c
#ifdef MACRO
#  error MACRO is defined
#else
#  error MACRO is undefined
#endif
#if MACRO
#  error MACRO is non-zero
#else
#  error MACRO is zero
#endif

以下的预期输出是什么?

$ gcc           -c macros.c
$ gcc -DMACRO   -c macros.c
$ gcc -DMACRO=0 -c macros.c

Answer:这是我机器上的 gcc 预处理器的作用。

$ gcc           -c macros.c
macros.c:4:4: error: #error MACRO is undefined
macros.c:9:4: error: #error MACRO is zero
$ gcc -DMACRO   -c macros.c
macros.c:2:4: error: #error MACRO is defined
macros.c:7:4: error: #error MACRO is non-zero
$ gcc -DMACRO=0 -c macros.c
macros.c:2:4: error: #error MACRO is defined
macros.c:9:4: error: #error MACRO is zero
$

Lesson: #ifdef MACRO对于定义性评估为 true即使定义的值为 0(零).

另一个 C 预处理器问题!按照 C 标准,这应该是这样吗?


任何未定义的宏都将被视为定义为 0,以便计算控制表达式#if声明。从 C99 §6.10.1/3-4(添加强调):

3) 表单的预处理指令

# if constant-expression new-line groupopt
# elif constant-expression new-line groupopt

检查控制常量表达式的计算结果是否为非零。

4) 在评估之前,预处理标记列表中的宏调用将成为 控制常量表达式被替换(修改的宏名称除外) 由defined一元运算符),就像在普通文本中一样。如果令牌defined是 由于此替换过程或使用而生成defined一元运算符 与宏替换之前的两个指定形式之一不匹配,行为是 不明确的。由于宏扩展和defined一元 运算符已执行,所有剩余的标识符(包括词法上的标识符) 与关键字相同)被替换为 pp-number 0,然后每个预处理 令牌被转换为令牌。 [...]

因此,例如,这样的表达式:

#if !FOO

将评估为1 if FOO未定义,因为它将被视为 0,然后!FOO将被评估为!0,即1.

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

对于定义为 0 的宏,#ifdef 和 #if 之间的细微差别 的相关文章

随机推荐

  • 如何忽略 Git 合并中的文件?

    我正在开发一个有两个分支的 Django 网站 master and dev master是生产版本 不应直接在此处完成任何工作 所有的改变都应该来自合并dev分支 一旦被认为是稳定的 dev正如您可能猜到的那样 是开发分支 所有更改都在这
  • ViM-LaTeX、python 和 Mac OS 10.8.1 以及一个奇怪的错误

    我刚刚将我的机器更新到 Mountain Lion 10 8 1 并尝试安装 vim latex 我已经每天使用该套件大约 5 年了 但是当尝试进行全新安装并打开 tex 文件时 我收到以下错误消息 UnitCircleAnalysis t
  • 提取模式后的值

    一个初学者的问题 我有一个这样的列表 x lt c aa v12 bb x21 cc f35 xx r53 bb g 25 yy h48 nn u75 bb 26 gg m98 但还有更多行 我需要提取 bb 和 之间的内容 IE 我想 x
  • 父类可以调用子类方法吗?

    参考here https stackoverflow com questions 1385895 accesing a function via string stored in hashtable A是预编译的Java类 我也有源文件 B
  • OSMDroid 从资产文件夹加载自定义离线图块

    我想知道是否可以做这样的事情 我知道需要修改一些现有代码才能实现这一目标 但我想知道是否有人知道在哪里查看以及如何执行此操作 我在地图上的特定区域放置了一些自定义图块 作为 OSM 图块提供程序的替代品 但需要将它们存储在 assets 文
  • 将 JSON 转换为 Python 对象:如何处理 DateTime 转换?

    我有一个 C 控制台应用程序 可将 POCO 类序列化为 JSON 字符串 我使用 JSON Net 进行序列化 此应用程序中的 JSON 被转储到文件中 并由 Python 2 7 脚本读入 问题就在这里 JSON 序列化获取我的类上的所
  • 如何使用curl和PHP设置自定义请求标头键?

    我使用curl 和php 上传文件 我需要帮助来设置自定义请求标头键 例如 X Filename blahblah zip X Filesize 2677 X Filetype application zip 您必须使用curl setop
  • 如何修改 OpenXML TableCell 的前景色和背景色?

    我正在创建表格单元格 如下所示 private static TableCell GetHeaderCell string cellText var tc new TableCell new Paragraph new Run new Te
  • 如何将对象排序到存储桶中表示为有效的 JPQL 表达式?

    我想显示一个 2D 图表 其中包含给定时间跨度内处理的对象数量 映射在 JPA 中 在 30 分钟的时间内 这个数量可以扩展到大约 30k 个对象 作为一名 DBMS 我在 4 2 21 版中使用 PostgreSQL 9 4 和 JPA
  • 为什么我不需要在 C++20 中的依赖类型之前指定“typename”?

    这段代码在 C 20 中编译 使用 gcc 10 1 没有使用typename依赖类型之前的关键字std vector
  • Docker - eclipse-mosquitto:2.0.7 错误:地址不可用

    我正在尝试在 Windows 10 中将 mosquitto 作为 docker 容器运行 下面出现错误日志地址不可用 1614449526 mosquitto version 2 0 7 starting 1614449526 Confi
  • Firefox 开发者版缺少添加监视功能

    更新到 52 0a2 后 我无法在 javascript 调试器中创建自己的表达式 添加监视等 当我右键单击某个变量时 我过去只是从上下文菜单中选择 添加文本到监视表达式 但在最新版本中它丢失了 我必须启用某些功能吗 thanks The
  • 创建一个倒计时器,每 5 秒打印一次列表中每个值的剩余时间

    我正在尝试在 Flutter 中创建一个倒计时器来打印剩余时间每 5 秒直到计时器用完 然后为值列表中的下一个值运行相同的倒计时器 下面的递归函数接近 但它在转到下一个值之前等待 迭代 List即使剩下的时间越来越少Timer import
  • 将文本字段添加到 SKScene

    我正在使用 Sprite Kit 创建一个游戏 我想添加一个文本字段供玩家输入他们的名字 如何使用 Sprite Kit 创建文本字段 我将创建一个玩家对象 我已经设置了 并使用他们输入的名称和默认分数 0 混合 UITextfields
  • 来自 GET/POST 的 Rails 参数

    我对 Rails 相当陌生 正在编写一个登录表单 我使用 form tag 将用户的提交传递给帐户控制器 现在 我不希望用户能够通过 GET 请求输入其登录详细信息 那么如何检查某个参数是 GET 还是 POST 参数 提前致谢 在 Rai
  • Google API 将请求从 Android 应用发送到 google plus

    我正在开发一款安卓应用程序 众所周知 Facebook SDK 提供了使用请求对话框向其他用户发送请求的功能 https developers facebook com docs android send requests https de
  • Spring Boot - 自定义 JSON 序列化 [重复]

    这个问题在这里已经有答案了 在使用 Jackson 库时 我通常使用 mixin 来执行自定义序列化和反序列化 Spring Boot 应用程序中的 RestController 具有类似于下面列出的方法 我猜 Spring Boot 使用
  • app.post() 不适用于 Express

    我遇到 Express 问题 我尝试使用 app post 函数 但它不起作用 我不知道为什么 虽然我包括了 bodyParser 问题 页面加载没有响应 没有错误消息 我没有看到 console log app js var expres
  • 升级TortoiseSVN 1.8问题

    我升级了乌龟SVN http en wikipedia org wiki TortoiseSVNWindows XP 上从 1 7 12 升级到 1 8 之后它要求升级SVN格式 我尝试升级 但它一直询问并且命令没有产生错误 我尝试从服务器
  • 对于定义为 0 的宏,#ifdef 和 #if 之间的细微差别

    给定以下 C 文件 cat macros c ifdef MACRO error MACRO is defined else error MACRO is undefined endif if MACRO error MACRO is no