关于 C 中的 ## 预处理器

2023-11-23

Given

#define cat(x,y) x##y

电话cat(a,1)回报a1, but cat(cat(1,2),3)未定义。 但是如果我也定义#define xcat(x,y) cat(x,y),那么结果是xcat(xcat(1,2),3)就是现在123。有人可以详细解释一下为什么会这样吗?


我使用 GCC 和 Clang 对此进行了测试。

GCC 给出错误:

test.c:6:1: error: pasting ")" and "3" does not give a valid preprocessing token

Clang 给出错误:

test.c:6:11: error: pasting formed ')3', an invalid preprocessing token
  int b = cat(cat(1,2),3);

似乎发生的事情是编译器包装了结果cat(1,2)一旦展开就放在括号中;所以当你打电话时cat(1,2)在你的代码中,它确实给了你(12)。然后,调用cat((12),3)再次导致((12)3),这不是一个有效的标记,这会导致编译错误。

普遍的观点是“当使用标记粘贴运算符 (##) 时,您应该使用两级间接”(即,使用您的xcat解决方法)。看为什么宏需要双层间接寻址? and 对于需要将两个标记粘贴在一起的宏应该做什么?.

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

关于 C 中的 ## 预处理器 的相关文章

  • 为什么不能将字符串文字连接到 __FUNCTION__?

    Isn t FUNCTION 字符串文字 我一直以为是这样的 FILE 但我刚刚发现我无法将字符串文字与其相邻连接 如果它不是字符串文字 那么它的定义是什么 我无法让 cscope 解决它 E g include
  • 如何正确地将 C 程序拆分为文件并包含?

    我组织了我的程序 将每个实体拆分在自己的文件中 是这样的 main c include student h include subject h include classroom h define PI 3 14 int sum int a
  • 如何仅在本地标头上运行预处理器?

    我希望预处理器读取本地标头的包含内容 但忽略系统标头的包含内容 换句话说 如何让预处理器跳过以下形式的预处理指令 include
  • 用于将十六进制字符串转换为字节数组的预处理器宏

    我已将 AES 128 密钥定义为 IDE 中的构建符号 以便它像这样调用 GCC arm none eabi gcc D AES KEY 3B7116E69E222295163FF1CAA1681FAC 这相当于 define AES K
  • C 预处理器:在 #warning 中展开宏

    我想在 warning 指令中打印宏值 展开宏 例如 对于代码 define AAA 17 warning AAA 所需的编译时输出是 warning AAA 17 我该用什么 或者 如何增强代码 您可以使用预处理器指令 pragma me
  • 在 C 中创建字符串的宏

    替代标题 以帮助搜索 将预处理器标记转换为字符串 我怎样才能从一个字符串C宏的价值 原始问题 我想用C define在编译时构建文字字符串 该字符串是因调试 发布等而更改的域 我想做这样的事情 ifdef TESTING define IV
  • 使用预处理器在 C 中进行模板化

    我想知道为什么我从来没有见过下面的方式来实现模板 之前在C中 我的想法是让预处理器进行模板工作 容器 h ifndef TEMPLATE TYPE error missing decalaration TEMPLATE TYPE endif
  • 奇怪的宏定义问题

    我想在编译时根据另一个宏的值定义一个宏 但是这段代码没有按预期执行 include
  • 如何定义预处理器宏来检查iOS版本

    我用它来检查iOS版本 但它不起作用 ifndef kCFCoreFoundationVersionNumber iPhoneOS 5 0 define kCFCoreFoundationVersionNumber iPhoneOS 5 0
  • 实现编译时机制检查字符串的唯一性

    定义我的问题的最简单方法是我正在尝试实现一种机制来检查是否已使用相同的字符串 或一对 数字 字符串 我希望使用 C 预处理器以智能方式实现此机制 我还希望这种机制在调试模式下出现冲突或运行时错误时 通过检查断言 给我编译错误 我们不希望开发
  • QT5 迁移和 Boost:if.hpp:宏参数不匹配错误

    在 qt 4 8 中我使用了 boost 1 52 一切都好 现在我尝试转移到 QT5 并得到if hpp Macro argument mismatch线上错误131 BOOST MPL AUX NA SPEC 3 if 在一些QT论坛
  • 你能在 C 中#define 注释吗?

    我正在尝试做一个调试系统 但它似乎不起作用 我想要完成的是这样的 ifndef DEBUG define printd else define printd printf endif 有没有办法做到这一点 我有很多调试消息 但我不喜欢这样做
  • 如何检索 C99 可变参数宏的最后一个参数?

    Visual Studio 失败的 static assert 错误消息完全由错误代码和 static assert 的第二个参数组成 没有任何其他消息表明这是静态断言失败 我想做一个宏来解决这个问题 例如 作为第一次尝试 define S
  • 宏展开错误

    我一直在尝试理解宏扩展 发现第二个 printf 给出了错误 我期望第二个打印语句生成与第一个打印语句相同的输出 我知道有一些函数可以进行字符串连接 我发现很难理解为什么第一个打印语句有效而第二个则无效 define CAT str1 st
  • 我可以在调用者处将函数参数默认为 __FILE__ 的值吗?

    在 C 中 我可以为函数提供一个默认参数吗 PRETTY FUNCTION FILE and LINE 在调用者处定义 而不是在不使用宏的情况下在头文件中提供默认值的地方 您不能 但您可以通过附加宏来实现此行为 例如 DEFINE THRO
  • 根据模板参数更改member-typedef?

    我在这里遇到这个问题 我不知道如何解决 我想要一个模板类 它采用整数作为模板参数 并相应地为另一个类设置模板参数 template
  • 为什么要在项目中使用#include_next?

    引用iOS有关包装器标头的文档 http developer apple com library ios documentation DeveloperTools gcc 4 0 1 cpp Wrapper Headers html inc
  • C 中类似函数的宏定义

    我想定义一个像 MACRO 这样的函数 IE define foo x if x gt 32 x else 2 x endif 那是 if x gt 32 then foo x present x else foo x present 2
  • #elif 定义时不带括号

    使用 VS2005 和 BLAH BLAH 定义以下预处理器条件为 false elif defined BLAH BLAH 但如果我把它改成 elif defined BLAH BLAH 是真的 为什么括号在这里会有所不同 它应该没有任何
  • 包含目录中的所有文件?

    如何实现以下代码想要实现的目标 include dir In Bash HEADER all headers h echo ifndef ALL HEADERS gt HEADER echo define ALL HEADERS gt gt

随机推荐

  • GMap .net 离线

    我正在使用 C 中的 Gmap 很棒的 AP I 顺便说一句 开发一个应用程序 不要与 google map API 混淆 从那时起我做了一些非常酷且有用的东西 我的问题是我的一些客户没有互联网连接 这就是为什么我需要能够离线显示背景 地图
  • Async.Catch 不适用于 OperationCanceledException

    我使用 Async Catch 来处理异步工作流程引发的异常 work gt Async Catch gt Async RunSynchronously gt fun x gt match x with Choice1Of2 gt succ
  • Python Pandas:将嵌套字典转换为数据帧

    我有一个这样的迪克 1 tp 26 fp 112 2 tp 26 fp 91 3 tp 23 fp 74 我想转换成这样的数据框 t tp fp 1 26 112 2 26 91 3 23 74 有人知道怎么做吗 Try DataFrame
  • InputText 组件中的默认文本(占位符)

    我想在 JSF Primefaces 中显示默认的信息文本输入文本成分 当用户单击文本字段时 该文本应该消失 当他点击外部而不输入任何内容时出现 如果用户提交的表单没有任何值 则不应将此默认值设置为 Bean 的属性 我知道在 Manage
  • quarkus 整个包的本机反射配置

    我正在构建 quarkus 本机并使用 Stripe sdk 作为外部库 为了支持 Stripe sdk 我需要创建反射配置 json文件并在 application properties 中设置quarkus native additio
  • 如何强制gdb在程序执行开始后立即停止?

    我尝试在每个有意义的函数上设置断点 但程序在到达其中任何一个之前退出 有没有办法让程序从一开始就以逐步模式运行 以便我可以看到发生了什么 我正在尝试调试 usr bin id 如果它很重要 我们有它的自定义插件 但它的行为不正确 附 启动命
  • 为什么可以内联初始化静态常量变量而不是普通静态变量(C++)

    如果我这样做 class Gone public static const int a 3 它有效 但如果这样做 class Gone public static int a 3 它给出了一个编译错误 现在我知道为什么第二个不起作用 我只是
  • 如何将DLU转换为像素?

    Microsoft 在其 UI 指南中使用对话长度单位 DLU 如何将它们转换为像素 据我所知 DLU取决于系统字体大小 您能建议一些在 Delphi for Win32 中进行此类转换的简单方法吗 首先我们从what对话单元是 为此我将引
  • 如何在prometheus yml配置文件中配置特定IP?

    我想使用特定的 IP 地址运行 Prometheus 默认情况下 它在本地主机上运行 我在中没有看到任何这样的选项普罗米修斯配置 您可以使用命令行选项来配置监听地址 prometheus web listen address 0 0 0 0
  • 在 UIView 中创建内部阴影[重复]

    这个问题在这里已经有答案了 我想在我的身上创造一个内在的阴影UIView在 iPad 上这样 This UIView可以改变大小 所以我不能使用简单的图像来创建这种阴影 我已经测试过setShadow等等 但它只是创建了一个投影 知道如何创
  • 从 SharedPreferences 设置和获取 StringSet?

    我正在构建一个 Android 应用程序 我想在首选项中存储一组字符串 以便根据登录信息跟踪谁使用了该应用程序 我不想使用数据库 所以我知道我应该使用 SharedPreferences 来存储登录人员的列表 我希望能够重置此列表 以便将个
  • 使用中位数和分组依据以及谷歌表格进行查询

    我需要获得分组中位数 我已经对表单的数据进行了分组 From type Weight A person person 4 A person person 3 A person organization 11 A person person
  • 在 QToolTip 中使用图片或图像

    有没有办法在 QToolTip 中显示图片 图像 我想显示键盘按钮的小图像 以向用户解释他可以在该特定小部件上使用哪些按钮 快捷方式 您可以使用以下 html 代码轻松显示图像 QToolTip showText QCursor pos i
  • AngularJS 和谷歌云端点:需要演练

    我是 AngularJS 的新手 但我真的很喜欢 AngularJS 的工作方式 因此我想将其部署为我的 Google 云端点后端的客户端 然后我立即遇到两个问题 1 放在哪里我的回调 那么它能够在 ANGularJs 控制器中工作吗 2
  • 在字符串中包含常量而不连接

    PHP 中有没有一种方法可以在字符串中包含常量而无需连接 define MY CONSTANT 42 echo This is my constant MY CONSTANT No 对于字符串 PHP 无法区分字符串数据和常量标识符 这适用
  • 使用元素求幂加速嵌套 for 循环

    我正在编写一个大型代码 我发现自己需要加速其中的特定部分 我创建了一个MWE如下图所示 import numpy as np import time def random data N Generate some random data r
  • 如何以编程方式打开 Safari 扩展 ToolbarItem 弹出窗口

    我想以编程方式触发 Safari 扩展工具栏项目上的 单击 事件 以便在网页上发生某些情况后出现我的自定义弹出窗口 我正在使用新的 Xcode 扩展 IDE 并使用界面生成器构建了我的弹出窗口 目前 StackOverflow 上的所有答案
  • 使用 .bat 文件运行 php 脚本

    我需要每天晚上在我的服务器上运行一个 php 脚本 在 Linux 系统上我设置了一个 cron 作业 但我被困在 Windows 系统上 我知道我必须使用 Windows 任务计划程序设置一个任务 并且该任务需要运行一个 bat 文件 该
  • 向 DataTable 添加多行

    我知道有两种方法将带有数据的新行添加到DataTable string arr2 one two three dtDeptDtl Columns Add Dept Cd for int a 0 a lt arr2 Length a Data
  • 关于 C 中的 ## 预处理器

    Given define cat x y x y 电话cat a 1 回报a1 but cat cat 1 2 3 未定义 但是如果我也定义 define xcat x y cat x y 那么结果是xcat xcat 1 2 3 就是现在