【问题标题】:How to pass the result of a function as a Macro variable?如何将函数的结果作为宏变量传递?
【发布时间】:2013-04-01 17:42:35
【问题描述】:

假设我设置了一个宏扩展如下...

#define WARN_START @"DANGER"
#define WARN_RESET @"THE COAST IS CLEAR"
#define WARN(x) WARN_START x WARN_RESET

输入 WARN(@"*** Your boss is coming. ***")

输出DANGER *** Your boss is coming. *** THE COAST IS CLEAR

假设我有一个函数……

NSString * WhosComing(void){ return @"*** Some fool. ***"; }

如何在不先将其分配给变量的情况下将此类函数的结果传递给宏,即

WARN(WhosComing())

错误expected ')'

我弄乱了额外的括号,即

#define WARN((x))…。或者 ...WARN_START (x) WARN_RESET 但是...

错误invalid operands to binary expression

以及尝试将 cuntion 作为指针或其他东西(即WARN(&WhosComing()))传递,但无济于事。我确信这是可能的/简单明了……但我没有计算机科学学位,所以我从来没有学过……对某人来说容易回答吗?

【问题讨论】:

  • kbd 不是用于显示输入和输出,而是用于显示键盘的键。
  • @AnoopVaidya 什么,你不喜欢吗?
  • 不,Input:Output : 会比按钮样式更好看。
  • 您不想将其分配给变量是因为您想避免重复编写该代码还是出于其他原因?

标签: objective-c c function pointers macros


【解决方案1】:

你不能用宏做你正在尝试的事情。在编译期间连接相邻的字符串字面量是 C 语言(以及因此是 Objective-C、C++)的一个特性,并且这对于 Objective-C 进行了扩展以包含 NSString 字面量。

您的宏扩展为:

@"DANGER" @"*** Your boss is coming. ***" @"THE COAST IS CLEAR"

然后编译器将这 3 个文字连接成 1。

但是传入你的函数,你会得到:

@"DANGER" WhosComing() @"THE COAST IS CLEAR"

这是无效代码。

有多种解决方案;如果真的担心函数调用的成本,您可以使用真正的函数,将其内联:

NS_INLINE NSString *WARN(NSString *msg)
{
   return [NSString stringWithFormat:@"%@%@%@", WARN_START, msg, WARN_RESET];
}

【讨论】:

    【解决方案2】:

    好吧,你不能在编译时插入函数的结果,因为很明显,函数的结果在执行之前并不存在。但你可以这样做:

    #define WARN(x) [NSString stringWithFormat:@"%@ %@ %@", WARN_START, (x), WARN_RESET]
    

    但这并不比函数更好,不是吗?如果宏的参数是文字字符串,您可以按照您想要的方式编写它。但是由于参数的值在编译时甚至都不知道,所以在宏扩展阶段你不能用它做很多事情,所以发出一个在运行时产生你想要的值的表达式几乎是你唯一的选择.

    【讨论】:

    • 另一个答案也很好,但我用这个..实际上简化了?有点像#define WARN(x) [NSString stringWithFormat:WARN_START %@" WARN_RESET, (x)] 谢谢。
    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多