假设我有许多C结构,我想要一组特定的函数来操作.
我想知道以下是否是合法的方法:
typedef struct Base {
int exampleMember;
// ...
} Base;
typedef struct Foo {
Base base;
// ...
} Foo;
typedef struct Bar {
Base base;
// ...
} Bar;
void MethodOperatesOnBase(void *);
void MethodOperatesOnBase(void * obj)
{
Base * base = obj;
base->exampleMember++;
}
Run Code Online (Sandbox Code Playgroud)
在示例中,您将注意到两个结构Foo并Bar以Base成员开头.
而且,在MethodOperatesOnBase那里,我将void *参数转换为Base *.
我想传递指针Bar和指向Foo此方法的指针,并依赖结构的第一个成员作为Base结构.
这是可以接受的,还是有一些(可能是编译器特定的)问题需要注意?(比如某种类型的打包/填充方案会改变结构的第一个成员的位置?)
请注意,我试图写一个小例子来复制这个问题,但到目前为止我没有这样的运气.有问题的代码是我不能放在这里的大型框架的一部分.
我有一个模板类,有一个数据成员.这个类的构造函数有副作用,只能在该对象上调用一次(假设ctor只能被调用一次 - 这应该是真的).
经过一段时间试图弄清楚为什么要进行两次调用之后,我暂时跟踪对象的内存地址(使用地图),看看它是否确实是在没有调用析构函数的情况下重新构造的对象(I 解析析构函数中的地址,因此如果首先销毁原始对象,则另一个对象可以取代它.跟踪器将触发一个断言,如果相同的地址再次跟踪(不untracking第一).
我很困惑地看到对象的构造函数被调用了两次而我的临时内存跟踪器触发了一个断言.使用断点进行调试可确认连续两次调用构造函数,而无需插入任何其他代码.也就是说,在退出对象的内存地址所在的类的构造函数后,xyz由于某种原因我再次进入它并且内存地址是相同的xyz.
对这种行为可能有什么解释? 我尽力解释.随意要求澄清.