将结构更改为类(以及其他类型更改)和ABI/代码生成 < > C++中的结构和类在手工编写代码时是可以互换的。

将结构更改为类(以及其他类型更改)和ABI/代码生成 < > C++中的结构和类在手工编写代码时是可以互换的。,c++,swig,abi,C++,Swig,Abi,但是,如果我想链接到现有代码,如果我在生成原始代码后在头中重新声明一个结构为类,或者反之亦然,我能期望它有什么不同(例如break、nasical demons等) 因此,情况是该类型被编译为一个结构(或类),然后我将头文件更改为另一个声明,然后再将其包含在我的项目中 现实世界的用例是,我使用SWIG自动生成代码,它根据给定的结构或类生成不同的输出;我需要将一个更改为另一个,以使其输出正确的接口 举例如下: 我机械地将其重新定义为: /*struct*/class IVertexManipula

但是,如果我想链接到现有代码,如果我在生成原始代码后在头中重新声明一个结构为类,或者反之亦然,我能期望它有什么不同(例如break、nasical demons等)

因此,情况是该类型被编译为一个结构(或类),然后我将头文件更改为另一个声明,然后再将其包含在我的项目中

现实世界的用例是,我使用SWIG自动生成代码,它根据给定的结构或类生成不同的输出;我需要将一个更改为另一个,以使其输出正确的接口

举例如下:

我机械地将其重新定义为:

/*struct*/class IVertexManipulator
{public:
};
原始库使用原始头进行编译,不受影响。包装器代码使用修改后的表单生成,并使用它们进行编译。然后,将两者链接到同一个程序中,共同工作。假设我对两个库使用完全相同的编译器

这类事情没有定义吗?“未定义”,但期望在实际编译器上工作?完全允许

我正在做的其他类似更改包括从参数中删除一些默认值(以防止歧义),以及从SWIG看不到类型的几个类中删除字段声明(这改变了类的结构,但我的推理是,生成的代码应该需要这些信息,只需要链接到成员函数)。同样,这会造成多大的破坏

e、 g:

:


…诸如此类。其他更改包括用typedef替换某些模板参数类型,并从某些结构中删除
packed
属性。同样,如果更改后的结构声明从未在机器代码中实际使用过,则似乎应该没有问题(只是生成链接到主库中的访问器函数的名称),但这是否可靠?是否确实如此?

这在技术上是未定义的行为

3.2/5:

一个类类型可以有多个定义,[…或者应该在头文件中定义的其他内容…]在程序中,如果每个定义出现在不同的翻译单元中,并且定义满足以下要求。如果在多个翻译单元中定义了名为
D
的实体,则

  • D
    的每个定义应包含相同的令牌序列;以及

…如果
D
的定义满足所有这些要求,则程序的行为应与
D
的定义相同。如果
D
的定义不满足这些要求,则行为未定义

基本上,您正在将第一个令牌从
struct
更改为
class
,并根据需要插入令牌
public
。标准不允许这样做

但在我熟悉的所有编译器中,这在实践中都是不错的


我正在做的其他类似更改包括从参数中删除一些默认值(以防止歧义)

如果声明不在类定义中,这实际上是正式允许的。TU中不同的转换单元甚至不同的作用域可以定义不同的默认函数参数。因此,您可能也可以这样做

其他更改包括将某些模板参数类型替换为其typedef

也正式允许在类定义之外:函数的两个声明使用相同类型的不同命名方式引用相同的函数

…删除字段声明…并从某些结构中删除压缩属性

不过,现在您正处于严重的危险区域。我不熟悉SWIG,但如果您做这种事情,最好确保使用这些“错误”定义的代码永远不会:

  • 创建或销毁类类型的对象

  • 定义继承或包含类类型成员的类型

  • 使用类的非静态数据成员

  • 调用使用类的非静态数据成员的内联函数或模板函数

  • 调用类类型或派生类型的
    virtual
    成员函数

  • 尝试查找类类型的
    sizeof
    alignof

/*struct*/class IVertexManipulator
{public:
};
s32 addHighLevelShaderMaterial(
    const c8* vertexShaderProgram,
    const c8* vertexShaderEntryPointName/*="main"*/,
    E_VERTEX_SHADER_TYPE vsCompileTarget/*=EVST_VS_1_1*/,
    const c8* pixelShaderProgram=0,
...
public:
    //IIndexList *Indices;