允许在Swift中使用C函数的桥接标头失败
我试图使用桥接头来允许从Swift调用C标准库中的C函数 我的项目是一个MacOSX命令行应用程序。我已经在项目中添加了一个名为“bridgeheader.h”的头文件。在此文件中,我添加了:允许在Swift中使用C函数的桥接标头失败,c,swift,C,Swift,我试图使用桥接头来允许从Swift调用C标准库中的C函数 我的项目是一个MacOSX命令行应用程序。我已经在项目中添加了一个名为“bridgeheader.h”的头文件。在此文件中,我添加了: #include < stdio.h> 但是,编译器报告printf是一个未解析的标识符 我做错了什么?我有一个类似的工作流,使用ifaddrs.h中的函数,没有任何问题 谢谢。已包含在导入基础中,因此您不需要 需要一个桥接头 实际问题是 int printf(const char * re
#include < stdio.h>
但是,编译器报告printf是一个未解析的标识符
我做错了什么?我有一个类似的工作流,使用ifaddrs.h中的函数,没有任何问题
谢谢。
已包含在导入基础中,因此您不需要
需要一个桥接头
实际问题是
int printf(const char * restrict format, ...);
接受变量参数列表,因此不会导入Swift。
幸运的是,有一个对应的函数采用va_列表
将其导入Swift:
int vprintf(const char * restrict format, va_list ap);
不幸的是,在Swift中传递va_列表有点麻烦,
特别是字符串。
示例:
vprintf("i=%d, x=%f\n", getVaList([12, 34.56]))
// i=12, x=34.560000
vprintf("status=%s\n", getVaList(["OK".cStringUsingEncoding(NSUTF8StringEncoding)]))
// status=OK
请注意,要打印到标准输出,只需使用
println()
带有字符串的格式化方法:
println(String(format:"i=%d, x=%f, status=%@", 12, 34.56, "OK"))
// i=12, x=34.560000, status=OK
嗨,马丁,谢谢你的回答。刚刚了解到变量函数不在Swift导入列表中,并且stdio.h已经导入。您完全正确,原生println更优越,但我选择printf时认为这是一个通过Swift调用C函数的简单示例。具有讽刺意味的是,前几天我使用的BSD网络代码提供了一个更简单的示例!
println(String(format:"i=%d, x=%f, status=%@", 12, 34.56, "OK"))
// i=12, x=34.560000, status=OK