如何在不插入空格的情况下用点连接两个宏?

2023-12-07

我正在预处理 InfoPlist 文件以包含我的修订号。我的标题如下所示:

#import "svn.h"

#define APP_VERSION 1.0
#define APP_BUILD APP_VERSION.SVN_REVISION

当我从程序中检查我的构建版本时,它是1.0 . 123456。但如果我尝试这个:

#import "svn.h"

#define APP_VERSION 1.0
#define APP_BUILD APP_VERSION ## . ## SVN_REVISION

I get

error: pasting formed 'APP_VERSION.', an invalid preprocessing token
error: pasting formed '.SVN_REVISION', an invalid preprocessing token

我见过这个问题但它实际上并没有给出答案; OP实际上并不需要连接令牌。我愿意。如何在不插入空格的情况下用点连接两个宏?


这个问题看起来是由预处理器的一个怪癖:连接运算符的参数不会首先扩展(或者......无论如何,规则很复杂),因此当前预处理器不会尝试连接1.0 and .,它实际上是在尝试粘贴这个词APP_VERSION到输出令牌中。在 C 语言中,单词中没有点,因此这不是一个有效的标记,因此会出现错误。

您通常可以通过几层包装宏来强制解决该问题,以便串联操作隐藏在至少两个替换后面,如下所示:

#define APP_VERSION 1.0
#define SVN_REVISION 123456

#define M_CONC(A, B) M_CONC_(A, B)
#define M_CONC_(A, B) A##B

#define APP_BUILD M_CONC(APP_VERSION, M_CONC(.,SVN_REVISION))

APP_BUILD    // Expands to the single token 1.0.123456

你很幸运,因为 C 预处理器编号可以有任意数量的点,即使 C 浮点常量可能只有一个。

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

如何在不插入空格的情况下用点连接两个宏? 的相关文章

  • 检查预处理器中整数类型的大小

    如何检查尺寸unsigned在 g 下的预处理器中 sizeof这是不可能的 因为在预处理期间没有定义它 这可能不是最优雅的方法 但您可以利用的一件事是 limits h 中定义的 UINT MAX 那是 如果 UINT MAX 65535
  • 用于将十六进制字符串转换为字节数组的预处理器宏

    我已将 AES 128 密钥定义为 IDE 中的构建符号 以便它像这样调用 GCC arm none eabi gcc D AES KEY 3B7116E69E222295163FF1CAA1681FAC 这相当于 define AES K
  • 根据.config剥离Linux内核源代码

    是否有任何有效的方法 也许通过滥用 gcc 预处理器 来获取一组剥离的内核源代码 其中根据 config 不需要的所有代码都被省略 好吧 我们采取了一些解决方案 首先 可以通过以下方式获取所使用的编译器命令 make KBUILD VERB
  • 带字符串的多行内联汇编宏

    我正在尝试实现一个宏 MY MACRO 它存储某个部分中前面带有 32 位整数的字符串 my section 例子 MY MACRO 200 my first string u x 以下是我尝试过的选项以及我面临的问题 我将不胜感激任何帮助
  • C语言中的宏(#define)

    我正在阅读hoard内存分配器的源代码 在gnuwrapper cpp文件中 有以下代码 define CUSTOM MALLOC x CUSTOM PREFIX malloc x 是什么意思CUSTOM PREFIX malloc x i
  • 由于 #ifdef,ctags 在带有不平衡大括号的源文件中被阻塞

    我在用ctags生成一个tags我正在处理的 C 项目的文件 但文件中缺少许多函数 这似乎是由于使用源文件中的大括号不平衡造成的 ifdef 一个 简化的 例子 include
  • 宏可以从其参数中删除字符吗?

    是否可以定义一个宏来修剪传入的字符串参数的一部分 例如 can this be defined define MACRO o int main printf MACRO ObjectT prints Object not ObjectT 宏
  • 可以嵌套 C 预处理器指令吗?

    例如 以下情况是可能的 define definer x define x 不 你不能那样做 英镑 符号在定义中具有不同的含义 这意味着 如果这是一个参数 则通过引用它使其成为一个字符串
  • 当指定 -g 时,gcc 会定义什么吗?

    很快 我想知道 gcc 或 g 我需要它C 但也对 c 感到好奇 定义了任何特殊符号 如果 g已启用 可以 如果是的话 是什么符号 在搜索过程中我发现 DEBUG是手动定义的 手动我的意思是 D DEBUG 并且是 Visual C 程序员
  • 类常量

    我有几个 obj c 类 每个类都需要一些在 switch 语句中使用的常量 我曾尝试使用以下命令在 m 文件中定义这些数字常量 define预处理器指令 所有这些常量都以 kCell 开头 这似乎工作得很好 但 Xcode 的代码感知向我
  • C 编程:预处理器、宏作为标记

    我正在尝试做一些概念上与此类似的事情 但似乎无法让它发挥作用 最后显示错误 任何想法 include
  • 模块化编译时数组扩展

    假设我处于这种情况 main c include
  • 宏定义确定大端还是小端机?

    是否有一行宏定义来确定机器的字节顺序 我正在使用以下代码 但将其转换为宏会太长 unsigned char test endian void int test var 1 unsigned char test endian unsigned
  • 多遍 C 预处理器 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 应用该方法是否明智 C多次对同一代码库进行预处理 具体来说 依次两次 例如 具有如下声明 define DECLARE FILE define
  • 避免 C 错误处理中的重复

    我经常编写最终成为长序列的代码 例如 int error error do something if error return error error do something else with some args if error re
  • 用于累积逗号分隔字符串的 C++ 预处理器宏

    我需要执行以下操作 const char my var Something REGISTER my var const char my var2 Selse REGISTER my var2 concst char all OUTPUT R
  • 根据模板参数更改member-typedef?

    我在这里遇到这个问题 我不知道如何解决 我想要一个模板类 它采用整数作为模板参数 并相应地为另一个类设置模板参数 template
  • 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
  • #pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗?

    我正在尝试使用来对齐数据成员 pragma pack n http msdn microsoft com en us library 2e70t5y1 28v vs 100 29 aspx 以下面为例 include
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin

随机推荐