objective-c - 预处理器宏 C/Objective-C

标签 objective-c c macros

你好,我正在尝试制作一个获取参数并尝试向其添加 postFix 的宏。

#define myPostFix HelloWorld
#define macro(x) x ##myPostFix 
#define CAlgThreadHandleObject macro(CAlgThreadHandleObject)

预期的行为是得到

CAlgThreadHandleObjectHelloWorld

我实际得到的是:

CAlgThreadHandleObjectmyPostFix 

请问 Some1 可以帮助我获得预期的行为吗? 请注意,myPostFix 是我必须在项目 GCC 定义中定义的东西,它应该因项目而异。

最佳答案

尝试:

#define myPostFix HelloWorld
#define macro_2(x, y) x##y
#define macro_1(x, y) macro_2(x, y)
#define macro(x) macro_1(x, myPostFix)
#define CAlgThreadHandleObject macro(CAlgThreadHandleObject)

您需要中间 macro_1 来让预处理器替换 myPostFix 赋值,然后是 macro_2 来连接字符串。 此解决方案允许您将 myPostFix 分配给您想要的值。

为了阐明预处理器和符号替换的工作原理,考虑到预处理翻译阶段不是对参数递归的,因此翻译需要通过一次以上的强制参数扩展来扩展所有参数.
在我们的例子中:

  1. CAlgThreadHandleObject 扩展为:macro(CAlgThreadHandleObject)
  2. macro(CAlgThreadHandleObject) 扩展为:macro_1(CAlgThreadHandleObject, myPostFix)
  3. macro_1 扩展为:macro_2(CAlgThreadHandleObject, HelloWorld)
  4. 最后一个 macro_2 扩展为:CAlgThreadHandleObjectHelloWorld

关于objective-c - 预处理器宏 C/Objective-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34977215/

相关文章:

objective-c - 是否可以有一个没有启用 ARC 但有一些 arc 文件的 iOS 应用程序?

ios - Interface Builder 无法打开文档 ".storyboard",因为它不存在

c - argv 是如何在内部处理的?

c - 在 C 中更新 CRC32 值

c - fseek(stdin,0,SEEK_SET) 和 rewind(stdin) 确实会刷新输入缓冲区 "stdin"。可以使用它们吗?

c++ - 可变参数宏 : cannot pass objects of non-trivially-copyable type through '...'

macros - Clojure 宏的评估

ios - 根据 View 是否为空显示/隐藏 UIBarButtonItem

ios - 使用#define,好的做法?

objective-c - ios - 在子类化时从 UIPickerView 传递值