【问题标题】:What does this #define in Objective C do?Objective C 中的这个#define 有什么作用?
【发布时间】:2016-06-07 16:09:50
【问题描述】:

我发现 #defines 可以在 Objective C 中使用来使更长的函数更小,但我不确定它在这里做了什么:

#define S(s) @#s

稍后在开发者使用它的代码中:

self.scopeDisplayNames = @[S(SPTAuthUserReadPrivateScope), S(SPTAuthUserReadEmailScope)];

我对它的作用感到非常困惑。另外,有没有办法在 Swift 中做到这一点?

谢谢!

【问题讨论】:

  • 好吧,我假设您将其用作快捷方式,但我不确定这个特定的 #define 做了什么。

标签: objective-c c-preprocessor


【解决方案1】:

它声明了一个将参数转换为NSString 字面量的宏函数。例如,S(hi) 将扩展为 @"hi"

供参考:

回答你的第二个问题,据我所知,在 Swift 中没有办法做到这一点。无论如何,这两种语言都不是一个好主意。

【讨论】:

  • 如果我想在 Objective C 中没有 #define 的情况下这样做,self.scopeDisplayNames = @[S(SPTAuthUserReadPrivateScope), S(SPTAuthUserReadEmailScope)]; 会是什么样子?
  • @user5812721 只需将S(X) 替换为@"X"。应该是@[@"SPTAuthUserReadPrivateScope", @"SPTAuthUserReadEmailScope"];
  • 确实你应该在没有宏的情况下这样做——这是对宏的可怕使用。您甚至没有获得任何简洁性,您只是不必要地牺牲了清晰度和易于调试。如果您需要字符串常量,则将它们定义为全局 C 常量。
【解决方案2】:

@Adrian 的回答是正确的,但我认为没有抓住重点,cmets 也是如此。

看代码示例:

self.scopeDisplayNames = @[S(SPTAuthUserReadPrivateScope), S(SPTAuthUserReadEmailScope)];

SPTAuthUserReadPrivateScope 是 Spotify SDK 中 NSString * 类型的全局常量。宏调用:

S(SPTAuthUserReadPrivateScope)

扩展为:

@"SPTAuthUserReadPrivateScope"

这是变量名作为字符串。

为什么不直接写成字符串呢?

因为如果你这样做了,你可能会犯一个简单的拼写错误,编译器不会捕捉到它。通过使用宏,Xcode 的自动完成功能支持该参数 - 只需开始输入名称即可。

因此,当需要将变量名称作为字符串时,宏是一种避免意外拼写错误的方法。

这是 Xcode 中的自动完成功能:

自动完成框会自动弹出。如果您开始键入字符串常量,例如@"SPT,然后自动完成不会自动激活,但是您可以通过按退出键来调用它。

HTH

【讨论】:

  • 宏根本不能保护您免受拼写错误的影响。自动完成和编译时检查是非常不同的事情。您仍然可以使用自动完成功能出现拼写错误,并且不会被捕获。它仍然是一个文字字符串,只是以更复杂的方式编写。
  • @Sulthan - 一旦您键入字符串常量的开头 ",则变量名的自动完成功能将不起作用。但是,当您开始键入宏参数时,自动完成功能会起作用,并且在问题中显示的用法,您无需全部输入即可完成所需的变量名称,毕竟这肯定是自动完成的存在理由吗?这个好处是否证明使用宏是另一个问题,有一个主观的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
相关资源
最近更新 更多