假设我设置了一个宏展开如下...
#define WARN_START @"DANGER"
#define WARN_RESET @"THE COAST IS CLEAR"
#define WARN(x) WARN_START x WARN_RESET
INPUT WARN(@"*** 你老板来了。***")
输出危险 *** 你的老板来了。 *** 海岸晴朗
✅
假设我有一个函数……
NSString * WhosComing(void){ return @"*** Some fool. ***"; }
如何将这样一个函数的结果传递给宏,而不先将其分配给变量,即
WARN(谁来了())
错误应为')'
我搞砸了额外的括号,即
#define WARN((x))
….或 ...WARN_START (x) WARN_RESET
但是...
错误二进制表达式的无效操作数
等
以及尝试将 cuntion 作为指针或其他东西传递,即 WARN(&WhosComing())
,但无济于事。我确信这是可能的/直接的……但我没有计算机科学学位,所以我从来没有学过如何……对某人来说简单的答案?
最佳答案
你不能用宏做你想做的事。 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];
}
关于objective-c - 如何将函数的结果作为宏变量传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15748492/