【问题标题】:Macro expansion inside NSStringNSString 内部的宏扩展
【发布时间】:2011-10-16 14:23:03
【问题描述】:

如何在 NSString 中展开宏?我有以下代码:

#define MAX_MESSAGE_LENGTH 2000

NSString *alertTxt = @"Your message exceeded MAX_MESSAGE_LENGTH characters";

如您所料,我得到的是“您的消息超过了 MAX_MESSAGE_LENGTH 个字符”,而不是“您的消息超过了 2000 个字符”。 有没有办法让我的 MAX_MESSAGE_LENGTH 在字符串中展开?

【问题讨论】:

  • 有多种晦涩难懂的 C 宏编码技术可能会奏效,但 Joe 的方法更直接且不易出错。
  • 没错。我只是想知道宏扩展。

标签: objective-c macros


【解决方案1】:

NSStrings 像 C 字符串一样工作。 IE。您可以通过将它们并排书写来连接字符串常量。

/* nested macro to get the value of the macro, not the macro name */
#define MACRO_VALUE_TO_STRING_( m ) #m
#define MACRO_VALUE_TO_STRING( m ) MACRO_VALUE_TO_STRING_( m )

#define MAX_MESSAGE_LENGTH 2000
NSString *alertTxt = @"Your message exceeded "
                      MACRO_VALUE_TO_STRING(MAX_MESSAGE_LENGTH)
                      " characters";

【讨论】:

  • 好一个,不幸的是它会截断包含 // 由于某种原因的字符串,就像在 URL 中一样——可能会将其余部分解析为 C 注释
  • 是的,我认为您需要将宏值定义为带引号的字符串,然后使用MACRO_VALUE_TO_STRING 跳过。
【解决方案2】:

你可以像这样使用stringWithFormat:

NSString *alertTxt = [NSString stringWithFormat:@"Your message exceeded %i characters", MAX_MESSAGE_LENGTH];

这使用与 NSLog 相同的占位符 %@%i 等。

【讨论】:

  • 您正在假设一个带有数值的宏
猜你喜欢
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 2016-11-11
  • 2019-11-07
  • 1970-01-01
相关资源
最近更新 更多