Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
允许在Swift中使用C函数的桥接标头失败_C_Swift - Fatal编程技术网

允许在Swift中使用C函数的桥接标头失败

允许在Swift中使用C函数的桥接标头失败,c,swift,C,Swift,我试图使用桥接头来允许从Swift调用C标准库中的C函数 我的项目是一个MacOSX命令行应用程序。我已经在项目中添加了一个名为“bridgeheader.h”的头文件。在此文件中,我添加了: #include < stdio.h> 但是,编译器报告printf是一个未解析的标识符 我做错了什么?我有一个类似的工作流,使用ifaddrs.h中的函数,没有任何问题 谢谢。已包含在导入基础中,因此您不需要 需要一个桥接头 实际问题是 int printf(const char * re

我试图使用桥接头来允许从Swift调用C标准库中的C函数

我的项目是一个MacOSX命令行应用程序。我已经在项目中添加了一个名为“bridgeheader.h”的头文件。在此文件中,我添加了:

#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