我在一个文件中定义了一个类型.从该文件导出既复杂又凌乱.我想把它分配到别的地方.大体上是来自C++的PIMPL习惯用法,用C语言呈现.
我知道它的大小.因此,我可以malloc(size),C生命周期的神奇规则意味着void指针可以用作该类型的实例.但是我不想把它放在堆上.
在C++中,可以使用对齐存储和放置新项.在C中,没有新的位置.据我所知,没有办法在C语言的一些任意内存中开始一个生命周期.
因此,我刚刚写了这样一个可疑的概念:
extern void thing;
__asm__("\t.type thing,@object\n"
".pushsection .data\n"
"\t.global thing\n"
"\t.p2align 3\n"
"thing:\n"
"\t.zero 4032\n"
"\t.size thing, 4032\n"
".popsection\n"
);
就C中的意义而言,我并不是完全有信心.具体地说,我不能稍后将其写入头文件中,然后在源代码中定义同名的特定类型--编译器拒绝这种组合.另见Why does gcc allow extern declarations of type void (non-pointer)?
还能有比这更好的吗?我不关心人机工程学,我只关心C的类型别名规则是否能够在future 的编译器版本中揭露这种诡计并将其付之一炬.
就语言而言,正确的做法是放弃封装,将类型及其内部的所有乱七八糟的东西移到头中,但我不想这样做.我喜欢它的包装.