Swift-C++互操作中SwiftInterfaceGeneratedHeader类排序引发编译错误问题问询
Swift-C++互操作中类引用顺序导致编译错误是否属于Bug?
这确实是Swift-C++互操作工具链中的Bug。
问题背景
在Swift与C互操作时,C代码需要引入自动生成的Swift接口头文件(比如示例中的cppswiftinterop-Swift.h),所有带公开API的Swift类会被转换成C++兼容的签名写入该头文件。但目前生成头文件时,类的声明是按类名字母顺序排列的,完全没有处理类型依赖关系,这就导致了编译错误。
示例代码
Swift代码
public class A { public func funca() { print("class A") } } public class B { public func funcb() { print("class B") } public func funcb2(pA: A) { pA.funca() } public func funcb3(pC: C) { pC.funcc() } } public class C { public func funcc() { print("class C") } }
C++代码
Test1.hpp
class Test1 { public: static void testfunc(); };
Test1.cpp
#include "Test1.hpp" #include "cppswiftinterop-Swift.h" void Test1::testfunc() { }
问题分析
- 类B的
funcb2参数是类A,由于A的字母序在B之前,生成的头文件中A的声明会先于B,C++编译时能识别A的类型,因此无错误; - 类B的
funcb3参数是类C,C的字母序在B之后,头文件里B的声明先出现,此时C还未被声明,C++编译器就会抛出Unknown type name 'C'的错误; - 若将C重命名为AA,AA的字母序在B之前,声明会提前,编译就能正常通过。
结论
正常的C头文件处理中,会通过前置声明或调整顺序保证被引用的类型先出现,但Swift的C互操作生成工具没有处理这种依赖关系,仅按字母序排列类声明,这明显不符合C++的编译规则,属于工具链的缺陷。
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

