当 C 预处理器宏定义两次时会发生什么?

2023-11-23

我定义了一个宏两次,如下所示:

#define a 2  
#define a 3   

我认为任何发生a代码中将替换为2, 什么时候#define a 3遇到了就没有了a代码中的 s 可以替换为3, 所以2将优先。

但是当我执行它的时候a被替换为3,为什么?


如果你像这样定义一个宏两次,编译器至少应该给你警告,如果不是错误的话。这是一个错误。

§6.10.3/2:当前定义为类对象宏的标识符不得由另一个标识符重新定义#define预处理指令,除非第二个定义是类似对象的宏定义并且两个替换列表相同。

您可以通过显式删除以前的定义来重新定义宏:

#define a 2
/* In this part of the code, a will be replaced with 2 */
...

#undef a
#define a 3
/* From here on, a will be replaced with 3 */
...

宏替换在读取文件时发生,使用文件中该点处活动的宏定义,except(大多数)预处理指令内部。

§6.10/7:除非另有说明,预处理指令中的预处理标记不受宏扩展的影响。

§6.10.3.5/1:宏定义持续(独立于块结构)直到相应的#undef遇到指令或(如果没有遇到)直到预处理翻译单元结束。

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

当 C 预处理器宏定义两次时会发生什么? 的相关文章

  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • Rust 中声明变量的宏?

    在 C 中 可以编写声明变量的宏 如下所示 define VARS a b c int a b c 当然 这不是您通常想要做的事情 在实际的例子中 我希望开始工作 但它并不那么简单 define VARS data stride a b c
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 如何通过异步回调等待 forEach 完成?

    示例代码 Map
  • Windows Phone 7 模拟框架?

    是否有适用于 Windows Phone 7 的模拟框架 或者我是否需要手动创建假框架 我在谷歌上没有找到任何东西 尽管我发现 WP7 资源页面上列出了 Moq 但我无法让它工作 没有支持 WP7 的 Mocking 框架 我怀疑在 WP7
  • Android webview第二次不加载URL

    我有加载到网络视图中的动态 URL 我使用了 WebChromeClient 来处理 java 脚本事件 因为我需要根据 onJsAlert 中 javascript 的事件来重定向用户 该网页是第一次加载 当我返回并加载相同的网址时 它正
  • 如何在调试 MSVC ABI Rust 程序时检查变量值?

    我已经下载了 Rust 1 7 0 的 MSVC ABI 版本 并按照文档中的猜谜游戏部分进行操作 我注意到构建使用本机工具链 在我的例子中为 Visual Studio 2015 Update 2 因此生成可由本机调试器 例如 WinDB
  • .NET 应用程序到 Mac OS X 应用程序?

    有没有办法将 NET 应用程序转换为 Mac OS X 应用程序 我正在使用 Visual Basic 2008 并且我希望 Mac 用户也使用我的应用程序 是否可以 如果是这样 请回复并提供链接或来源 答案很大程度上取决于您想要做什么 T
  • “AWSCognito”未定义

    我已经使用以下示例在 nodeJS 中实现 AWS Cognito 但我遇到了错误 AWSCognito 未定义为 no undef 参考链接 https github com aws amazon cognito identity js
  • 如何在 matplotlib 中制作分组箱线图

    我有三种算法 A B 和 C 我已经在不同的数据集上运行它们 并且希望将它们在每个数据集上的运行时间绘制为 Python 中的分组箱线图 作为我想要的视觉示例 我画了一幅糟糕的图 但希望它能表达要点 如果我的 python 数据如下所示 i
  • 无法安装 Docker - 哈希和不匹配(Ubuntu 18.04、Vagrant、Virtualbox)

    我只是无法在 Ubuntu 18 04 的新映像中安装 Docker 在 Virtualbox 中 使用 Vagrant 我正在使用官方网站的说明 https docs docker com install linux docker ce
  • 使用 SFTP 将文件从远程服务器直接复制到 Azure Blob 存储

    我有一个带有一堆静态文件的远程服务器 在Azure之外 我已在 Azure 中创建了辅助角色 并且希望使用该辅助角色通过 SFTP 将这些文件从远程服务器直接传输到我的 Blob 存储帐户 无需在本地复制到辅助角色 是否有关于如何做到这一点
  • JAXB 解组错误:预期元素为 <{ } Root>

    我正在重用其他地方生成的现有对象来解组以 String 类型传入的 XML 数据 物体 3 import java util ArrayList 4 import java util List 5 import javax xml bind
  • SQLite3 和多重处理

    我注意到当我在多处理环境中使用 sqlite3 时 它并不真正有能力也不可靠 每个进程都尝试将一些数据写入同一个数据库 以便一个连接被多个线程使用 我使用 check same thread False 选项进行了尝试 但插入的数量非常随机
  • 为什么javascript在迭代时将数组索引转换为字符串?

    这个 Javascript 逻辑让我困惑 我正在创建一个数组并将其第一个元素设置为数字 当我使用 for 循环对其进行交互时 Javascript 将数组键转换为字符串 为什么 我希望它保留一个数字 stuff stuff 0 3 for
  • PHP 电子邮件发送 BCC

    我知道有一些类似的问题 但我就是无法让它发挥作用 好的 我有一个从数据库中抓取的电子邮件列表 位于名为 emailList 的变量中 如果我将变量放入 我可以获取从表单发送电子邮件的代码 to节但是 我无法让它与密件抄送一起使用 我什至添加
  • 如何在 powershell 3 中将单个 txt 文件移动到 zip

    我正在尝试将一个文本文件复制 移动到 zip 文件 我不想解压它 复制文件并将其压缩回来 有什么方法可以直接将文本文件复制或移动到 powershell 中的 zip 中吗 当我在 powershell 中执行此操作时 当我尝试查看 zip
  • C++ Win32 未在 WM_DEVICECHANGE 上接收 DBT_DEVICEARRIVAL 或 DBT_DEVICEREMOVECOMPLETE

    我一直致力于检测 USB 插入 拔出 我已经使用 CreateWindowEx 实现了代码 并通过我的窗口进程回调传递了 WNCLASSEX 在插入和移除 USB 时 我成功收到 WM DEVICECHANGE 消息 但 wParam 始终
  • 如何将 JavaScript 变量“输出”到 HTML div 中

    我有一个 JavaScript 变量 我希望 HTML div 输出 7 我知道这很简单 但我似乎无法理解这一点 div Have 7 output here div 为 div 指定一个特定的 id 例如 div div 现在使用以下 J
  • 向上导航(操作栏的后箭头)不适用于片段

    我将抽屉布局作为我的活动的基本布局 并且我正在替换此抽屉布局内框架上的两个片段 第一个片段不会添加到片段的返回堆栈中 我在我的活动中显示汉堡包图标 我也希望在我的第一个片段中显示抽屉菜单 在第二个片段中 我禁用了汉堡包图标mActionBa
  • 是否可以使用输入值属性作为 CSS 选择器?

    是否可以使用 CSS 选择器来定位具有特定值的输入 示例 如何根据以下内容定位以下输入value United States
  • 使用 py2exe 捆绑 GTK 资源

    我正在使用 Python 2 6 和 PyGTK 2 22 6一体化安装程序在 Windows XP 上 尝试构建一个单文件可执行文件 通过py2exe 对于我的应用程序 我的问题是 当我将我的应用程序作为脚本运行时 即未内置到 exe文件
  • 当 C 预处理器宏定义两次时会发生什么?

    我定义了一个宏两次 如下所示 define a 2 define a 3 我认为任何发生a代码中将替换为2 什么时候 define a 3遇到了就没有了a代码中的 s 可以替换为3 所以2将优先 但是当我执行它的时候a被替换为3 为什么 如