在宏中用下划线替换空格?

2024-01-12

我可以编写一个单参数宏,它采用由空格分隔的单词/标记序列,并生成相同的序列,但每个单词/标记之间有下划线?

e.g.

MAGIC_MACRO(brave new  world)

将评估为

brave_new_world

Notes:

  • 我不介意每个空白字符是否变成下划线,只是至少使用一个。
  • 如果我不能做到这一点,我至少想知道这是否可以用两个词来实现。

我可以编写一个单参数宏,它采用由空格分隔的单词/标记序列,并生成相同的序列,但每个单词/标记之间有下划线?

当然,这是不可能的。预处理器中没有字符串操作实用程序。

哦,我在开玩笑呢。首先,你必须建立一个包含所有可能的单词组合的字典。为此,我们将有一本包含几个单词的小词典:

#define WORD_world  world,
#define WORD_new    new,
// etc.

你可能会得到这个模式。然后让我们实现将执行以下操作的宏:

brave new  world                 // our starting argument
WORD_##brave new world           // add WORD_ to all arguments and join arguments with spaces
WORD_brave new world
brave, new world                 // expand WORD_brave macro
WORD_brave WORD_new world        // add WORD_ to all arguments and join arguments with spaces
brave, new, world                // expand WORD_* macros
WORD_brave WORD_new WORD_world   // add WORD_ to all arguments and join arguments with spaces
brave, new, world,               // expand WORD_* macros
     /* --- repeat above steps up to maximum words you need to handle --- */
brave_new_world                  // join arguments with `_` ignoring last empty one

以下代码:

// our dictionary
#define WORD_world  world,
#define WORD_new    new,
#define WORD_brave  brave,
#define WORD_hello  hello,
#define WORD_Hello  Hello,

// the classics
#define COMMA(...)  ,
#define FIRST(a, ...)  a

// apply function f for each argument recursively with tail
#define FOREACHTAIL_1(f,a)      f(a,)
#define FOREACHTAIL_2(f,a,...)  f(a,FOREACHTAIL_1(f,__VA_ARGS__)) 
#define FOREACHTAIL_3(f,a,...)  f(a,FOREACHTAIL_2(f,__VA_ARGS__)) 
#define FOREACHTAIL_4(f,a,...)  f(a,FOREACHTAIL_3(f,__VA_ARGS__)) 
#define FOREACHTAIL_N(_4,_3,_2,_1,N,...)  \
        FOREACHTAIL_##N
#define FOREACHTAIL(f,...) \
        FOREACHTAIL_N(__VA_ARGS__,4,3,2,1)(f,__VA_ARGS__)

// if there are two arguments, expand to true. Otherwise false.
#define IFTWO_N(_0,_1,N,...)     N
#define IFTWO(true, false, ...)  IFTWO_N(__VA_ARGS__, true, false)

// If empty, expand to true, otherwise false.
// https://gustedt.wordpress.com/2010/06/08/detect-empty-macro-arguments/
#define IFEMPTY(true, false, ...)  IFTWO(true, false, COMMA __VA_ARGS__ ())

// Join arguments with `_`.
#define JOIN_U(a, b)      a##_##b
#define JOIN_TWO_IN(a,b)  IFEMPTY(FIRST, JOIN_U, b)(a, b)
#define JOIN_TWO(a,b)     JOIN_TWO_IN(a,b)
#define JOIN(...)         FOREACHTAIL(JOIN_TWO, __VA_ARGS__)

// Append WORD_ to each argument and join arguments with spaces.
#define WORD_             /* the last one expands to empty */
#define WORDS_TWO(a, b)   WORD_##a b
#define WORDS(...)        FOREACHTAIL(WORDS_TWO, __VA_ARGS__)

#define MAGIC_MACRO(a)  JOIN(WORDS(WORDS(WORDS(WORDS(WORDS(a))))))

MAGIC_MACRO(brave new  world)
MAGIC_MACRO(Hello world)

生产:

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

在宏中用下划线替换空格? 的相关文章

  • Clojure 宏expand

    Why does macroexpand arm getHand getFinger 扩展到 arm getHand getFinger while macroexpand gt arm getHand getFinger 扩展到 getF
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • C 预处理器库

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

    在另一个问题中 我刚刚发现了这个小珍珠C wisdom define for if false else for 这导致 MSVC 对于一个相当有效的语句发出 常量表达式 警告 for int i 0 i lt 10 i 我明白whyMSV
  • 使用 Scala 宏或反射实例化类

    在我的 scala 代码中 我希望能够实例化一个新类 例如 假设我有以下代码 class Foo def foo 10 trait Bar val bar 20 理想情况下 我希望能够做类似的事情 def newInstance A lt
  • 避免函数内装箱/拆箱

    对于数字密集型代码 我编写了一个具有以下签名的函数 def update f Int Int Double gt Double Unit 然而 因为Function3不是专门的 每个应用程序f结果对 3 个参数和结果类型进行装箱 拆箱 我可
  • Python 宏:用例?

    如果 Python 有一个类似于 Lisp Scheme 的宏工具 比如元Python https code google com p metapython 你会如何使用它 如果您是一名 Lisp Scheme 程序员 您会使用宏来做什么
  • 如何有条件地更改 Rust 宏的一小部分?

    我正在建造一个具有以下功能的板条箱foo 这个箱子有一个宏bar 根据是否做细微不同的事情foo is set 我可以复制整个宏 cfg feature foo macro rules bar Lots of rules A gt B cf
  • 包含防护的推荐命名约定是什么?

    包含守卫通常如何命名 我经常看到这样的情况 ifndef FOO H define FOO H endif 但是 我认为这不是很直观 如果看不到文件名 很难分辨出什么内容FOO H它的用途和它的名字所指的是什么 什么被认为是最佳实践 我个人
  • Objective C“#if”语法

    我对 如果 或 如果 有点困惑 if当我查看一些类时我看到的语法 例如 if someConstant someNumber do something elif etc versus if someConstant someNumber d
  • Common Lisp 反引号/反引号:如何使用?

    我在使用 Lisp 的反引号读取宏时遇到问题 每当我尝试编写一个似乎需要使用嵌入式反引号的宏时 例如 w x y 来自保罗 格雷厄姆的ANSI 通用 Lisp 第 399 页 我不知道如何以编译的方式编写代码 通常 我的代码会收到一整串错误
  • 如果未定义则跳过函数调用

    我有一个由不同模块组成的程序 模块通过函数调用互连 例如 State Init 调用各个模块的 init 函数 应可以禁用模块 从编译中排除 最简单的方法是使用预处理器定义 但这会生成大量代码 IF MODULE XXX COMPILE r
  • 更改预处理到文件后出现错误 1 ​​错误 LNK1104

    我必须使用预处理器 所以我改变了 配置属性 gt C gt 预处理器 gt 预处理为文件 gt 是 并得到错误 错误 1 错误 LNK1104 无法打开文件 Debug asnreal obj 这个问题的解决办法 我必须在 lib 文件的路
  • 如何检查类中是否存在成员名称(变量或函数),无论是否指定类型? [复制]

    这个问题在这里已经有答案了 这个Q是以下内容的延伸 模板化检查类成员函数是否存在 https stackoverflow com q 257288 514235 是否有任何实用程序可以帮助找到 类中是否存在成员名称 该成员可以是 变量或方法
  • C 相当于 C++ decltype

    在我的 C 项目中 有一个由另一位同事创建的结构体 其中包含一些函数指针 struct tools int tool a int int int 我无权更改此结构和相关文件 现在我正在使用该结构进行编码 我必须定义一个函数 其返回类型和参数
  • 最好的 AutoHotKey 宏? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Xcode 在调试版本中是否有自动设置的宏?

    所以我可以写这样的代码 ifdef whatever do stuff that will never show up in the production version endif 默认情况下没有什么用处 但您可以设置DEBUG用于调试构
  • C++ 编译时类型注册技巧

    我有以下情况 假设我有一堆类型 函子 我想在编译期间注册 编译它们 最好是像 boost mpl vector 这样的东西 你知道有什么技巧可以做得很好吗 我的愿望是拥有实现函子类型和注册文件的 hpp 文件 其中宏将类型引入编译中 例如
  • 宏:knownDirectSubclasses 被嵌套类型破坏?

    我有一个宏 它枚举密封特征的直接子类型 import scala reflect macros Context import language experimental macros object Checker def apply A U
  • 部分预处理 C 或 C++ 源文件?

    有没有办法部分预处理C或者C 源文件 我所说的 部分预处理 是指扩展一些但不是全部的 include 指令 例如 我想扩展 includes 指向我的项目标头 但不扩展 includes 指向其他库的标头 我尝试通过运行来做到这一点gcc

随机推荐

  • 如何创建持久化的AlarmManager

    编辑 根据 CommonsWare 的回答澄清了问题 我们通过 AlarmManager 安排一个警报每 60 秒触发一次 当我们的应用程序被终止时 我们的警报似乎不再执行 有没有办法让这些警报持续存在 即使应用程序被手动或被系统终止 这对
  • 我可以让 HttpWebRequest 包含 Windows 凭据而不等待 401 质询吗?

    我的应用程序与需要身份验证的内部 Web API 进行通信 当我发送请求时 我收到了预期的 401 质询 握手发生 经过身份验证的请求被重新发送 一切都正常进行 但是 我know需要授权 为什么我必须等待挑战 我可以强制请求发送凭据firs
  • 如何为给定字符串输入集合[重复]

    这个问题在这里已经有答案了 可能的重复 如何获得子集所有可能的组合 https stackoverflow com questions 13765699 how can i obtain all the possible combinati
  • 在 PyQt 中使用 pyttsx

    我正在 pyqt 中为我的聊天机器人制作 Gui 但我在这方面的代码中遇到了一些问题 def init self super Window self init self setGeometry 50 50 500 300 self setW
  • 如何在 Python 3.7 中向 multiprocessing.connection.Client(..) 添加超时?

    我正在运行两个Python 程序 程序 A 通过以下方式连接到程序 B多重处理 module Connection code in program A import multiprocessing import multiprocessin
  • 精度和的含义。双类型范围

    首先 请允许我承认我是一名经验丰富的程序员 拥有超过 10 年的编程经验 然而 我在这里问的问题是自从大约十年前我第一次拿起一本关于 C 的书以来一直困扰着我的问题 下面是一本关于Python的书的摘录 解释了Python的浮动类型 浮点数
  • 是否有一个保留插入顺序的 Set 也实现了 List?

    我正在尝试找到一个实现java util List and java util Set同时在Java中 我希望这个类只允许唯一的元素 如Set 并保留它们的顺序 例如List JDK 6 中存在吗 重要的是拥有List
  • PDO 占位符的有效字符

    在带有 PDO 的 PHP 中 我们限制使用哪些字符 我尝试过查看文档和在线但无济于事 我确实找到了一篇文章 其中用户在名称中使用了连字符 这破坏了查询 我正在编写一个动态生成这些名称的函数 并且由于连字符不是 no 所以我想知道是否有替代
  • NSArray 可变性和 arrayByAddingObject

    我以为我对 Objective C 中的对象和可变性有很好的理解 但我注意到一些奇怪的事情NSArray 如果我有以下不起作用 NSArray myArray NSUserDefaults standardUserDefaults arra
  • 使用 start_time 和 end_time 的ice_cube gem 发生单次事件

    这里一定有一些简单的事情被忽略了 我一直在尝试各种方法来创建基本的IceCube日程 https github com seejohnrun ice cube https github com seejohnrun ice cube 总体目
  • 根据日期范围合并数据框

    我有两个 pandas 数据框 一个 df1 三列 StartDate EndDate and ID 和第二个 df2 和日期 我想合并df1 and df2基于 df2 Date 之间df1 StartDate and df2 EndDa
  • 在其他函数参数中调用函数好吗?

    我想这个 public static string abc return abc 最好这样调用这个函数 string call abc Console writeline call 比这个 console writeline abc 有什么
  • TensorFlow 2.5.0 与 NumPy 1.21+ 不兼容? (2021-10-05)

    对于所有偶然发现这一点的人 我最近正在做图像分类 将 CNN 拟合到一些标记数据上 我想使用 keras 的模块进行数据增强 但是 我遇到了 NotImplementedError 更具体地说 它逐字地说如下 NotImplementedE
  • 使用存储库和实体框架在领域事件中实现实体持久化?

    我正在深入研究领域事件 并且需要一些关于出于历史原因对实体进行持久更新的建议 我的示例涉及用户实体和登录 public class UserService private UserRepository repository public U
  • 重构布尔表达式的工具[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个重构布尔表达式的工具 我有这样的表达 a1 gt b1 lt gt c or d AND
  • 即使应用程序退出后,如何使用 UIAutomation 工具继续测试 iOS 应用程序?

    我有一个应用程序 应用程序中有一个按钮 如果单击该按钮 则会退出应用程序 我正在使用 UIAutomation 仪器测试该应用程序 我想测试一下这个按钮 但应用程序退出后 仪器不再抛出异常 我想做的是 在应用程序存在后 我想重新打开应用程序
  • 如何建议在 Python 中使用自定义双下划线变量?

    我想知道 是否建议 Pythonic 在 Python 脚本中定义和使用自定义双下划线变量 函数 例如 tablename 如 SQLAlchemy 中使用的或 validateitem 在应用之前验证项目的自定义函数 setitem to
  • 为什么我在 Python 中使用 BeautifulSoup 会收到“'ResultSet'没有属性'findAll'”?

    所以我正在慢慢学习Python 并尝试制作一个简单的函数 从在线游戏的高分页面中提取数据 这是我将别人的代码重写为一个函数 这可能是问题 但我收到此错误 这是代码 gt gt gt from urllib2 import urlopen g
  • 为什么这个 subprocess.check_call() 不起作用?

    我在 Ubuntu 12 上使用 Python 2 7 运行这些代码片段 import subprocess args rsync rsh ssh tmp a 127 0 0 1 tmp b subprocess check call ar
  • 在宏中用下划线替换空格?

    我可以编写一个单参数宏 它采用由空格分隔的单词 标记序列 并生成相同的序列 但每个单词 标记之间有下划线 e g MAGIC MACRO brave new world 将评估为 brave new world Notes 我不介意每个空白