objective-c - 如何将函数的结果作为宏变量传递?

标签 objective-c c function pointers macros

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

#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/

相关文章:

objective-c - if语句: I found something strange. 为什么我的第二个 'if'等于no?

c - fread、fwrite 适用于大尺寸视频文件(约 180MB)

c - 如果客户端在 udp 客户端/服务器应用程序中出现故障,服务器如何处理

javascript - 想要同时使用 and 运算符

function - D 编译时函数类型提取

ios - [__NSArrayI objectAtIndex :]: message sent to deallocated instance 0x7fbdae1a2080

objective-c - 在其他 View 中调用时,使用 Interface Builder 创建的自定义 View 不会呈现

c - 错误 : Control may reach end of non-void function,

c++ - While Loop 不会循环 C++

objective-c - 难倒: NSURLConnection + php - key/value format issue