快速使用c结构

快速使用c结构,c,pointers,struct,swift,C,Pointers,Struct,Swift,很抱歉,我找不到用几个词来描述我的问题 我已经知道swift可以使用c语言编写的struct。比如说 int getx(Pointer *pointer); 在桥接头中 然后我可以直接使用指针 但在我的例子中,我有一个用C编写的库。有很多结构都有隐藏的实现。例如: 在连接头中 typedef struct Pointer Pointer; #include "user_input.h" 我不能再使用指针了,类型未知。在我的库中,指针用作 create_pointer(Pointer **

很抱歉,我找不到用几个词来描述我的问题

我已经知道swift可以使用c语言编写的struct。比如说

int getx(Pointer *pointer);
在桥接头中

然后我可以直接使用指针

但在我的例子中,我有一个用C编写的库。有很多结构都有隐藏的实现。例如:
在连接头中

typedef struct Pointer Pointer;
#include "user_input.h"
我不能再使用指针了,类型未知。在我的库中,指针用作

create_pointer(Pointer **pointer);
感谢您的帮助

另外,我没有定义结构指针的.h文件。指针的所有细节都是隐藏的,例如,通过函数访问它们

int getx(Pointer *pointer);
这是我的完整测试代码:
用户输入.c

#include <stdio.h>

#include "user_input.h"

struct Pointer {
    int x;
    int y;
};

void get_user_input(int *user_input) {
    scanf("%i", user_input);
}

void init_pointer(Pointer *point) {
    point->x = 20;
    point->y = 20;
}
桥接头.h

typedef struct Pointer Pointer;
#include "user_input.h"
梅因·斯威夫特

import Foundation
var pointer:Pointer = Pointer(x:10, y:20)

Xcode告诉我这个错误:指针未定义

如果在_u-header.h中包含指针类型定义的原始标头,则应该可以

typedef struct Pointer Pointer;
#include "user_input.h"
例如,如果有foo.h在其中声明结构和函数,那么不必在桥接头中进行任何额外的typdef调用,只需导入foo.h

那么您的Swift代码应该能够看到foo.h中声明的符号

更新:

您需要的:

  • 假设“foo.h”是指针为typedef-ed的头文件。也可以说“foo.c”是实现createPointer()的文件
  • 您需要在Xcode中创建一个Swift项目。将“foo.h”和“foo.c”添加到项目中
  • 在项目中添加一个名为“foo bridgeing header.h”的头文件(有时Xcode会在向项目中添加.c或.m文件时询问是否要创建一个桥接头文件,但对于开发人员种子,我还没有观察到这是一致的)
  • 在“foo bridgeing Header.h”中,您需要
    #包括foo.h
  • 完成此操作后,您应该能够从项目中的“main.swift”文件中调用“foo.h”中的任何符号
  • 例如,我有一个Swift项目。在这个项目中,我有一个Swift文件(main.Swift)、一个C头文件(test.h)、一个C源文件(test.C)和一个桥接头文件(test bridgeing header.h)

    内容如下:

  • 测试h:
  • 测试c:
  • main.swift:
  • 运行时,此输出:


    在改变我的问题后,我得到了一个答案

    当结构以隐藏方式实现时,这称为“不透明”

    所以我可以用copaquepenter

    var pointer: COpaquePointer = COpaquePointer.null()
    // some init code.
    init_pointer(pointer);
    

    桥接头.h

    #ifndef __user_input_h__
    #define __user_input_h__
    
    typedef struct Pointer Pointer;
    Pointer *create_pointer();
    void delete_pointer(Pointer *p);
    int pointer_x(Pointer *p);
    int pointer_y(Pointer *p);
    
    #endif
    
    #包括“user_input.h”
    
    用户输入.c

    #include <stdlib.h>
    
    struct Pointer {
        int x;
        int y;
    };
    
    Pointer *create_pointer() {
        Pointer *p = malloc(sizeof(struct Pointer));
        if (p) {
            p->x = 20;
            p->y = 20;
        }
        return p;
    }
    
    void delete_pointer(Pointer *p) {
        free(p);
    }
    
    int pointer_x(Pointer *p) {
        return p->x;
    }
    
    int pointer_y(Pointer *p) {
        return p->y;
    }
    
    main.swift

    <代码>导入基础 变量指针:COpaquePointer=create_pointer() println(“\(指针x(指针)),\(指针y(指针))”) 删除指针(指针) //编写包装器类可能会有所帮助。 类指针{ var_ptr:COpaquePointer init(){ _ptr=创建_指针() 断言(_ptr,“创建_指针()时失败”) } 脱硝{ 删除指针(_ptr) } 变量x:Int{ 获取{returnint(指针_x(ptr))} } 变量y:Int{ 获取{return Int(指针_y(_ptr))} } } var p=CPointer() println(“\(p.x),\(p.y)”)
    最重要的是我没有定义结构的.h,只有带typedef.Right的.h。这就是您要包含在桥接标头中的标题。我已测试但失败。你能给出一步一步的回答吗?我更新了我的答案。我不确定双指针等的规则是什么,但这应该允许您从Swift项目调用C代码。谢谢,我已经测试了您提到的方法。它起作用了。但是双指针仍然不起作用。作为我更新答案的补充,看来结构可能有问题。我一直在查看Xcode seed中的Swift文档,但找不到任何关于初始化类型定义结构并使用它们的明确内容。我留下我的答案是希望它能帮助尝试调用C函数的人,但结构似乎仍然是一个灰色区域;初始化指针(指针)这使得
    指针
    指向内存中的任何地方,并导致
    init_pointer()
    出现内存错误。如果Swift不知道C结构的形状,C中应该有几个函数知道如何分配、初始化和销毁它。这正是我要找的!包装可能是最安全的方式,尽管有点烦人。
    #include <stdlib.h>
    
    struct Pointer {
        int x;
        int y;
    };
    
    Pointer *create_pointer() {
        Pointer *p = malloc(sizeof(struct Pointer));
        if (p) {
            p->x = 20;
            p->y = 20;
        }
        return p;
    }
    
    void delete_pointer(Pointer *p) {
        free(p);
    }
    
    int pointer_x(Pointer *p) {
        return p->x;
    }
    
    int pointer_y(Pointer *p) {
        return p->y;
    }
    
    #ifndef __user_input_h__
    #define __user_input_h__
    
    typedef struct Pointer Pointer;
    Pointer *create_pointer();
    void delete_pointer(Pointer *p);
    int pointer_x(Pointer *p);
    int pointer_y(Pointer *p);
    
    #endif