http://c0x.coding-guidelines.com/6.7.2.1.html: 1401如果struct-declaration-list不包含命名成员,则行为未定义。这是否意味着以下是非法的?
struct C {} …
C中很少是非法的,这意味着你不能这样做。相反,C标准没有定义很多东西,这意味着,如果你这样做,C标准并没有说明会发生什么。没有命名成员的结构就是这样的。
C 2018 6.7.2.1 8部分说:
如果struct-declaration-list不包含任何命名成员(直接或通过匿名结构或匿名联合),则行为未定义。
如果您需要某些东西作为“未知类型”并且不想使用 void ,然后你可以声明一个标签已知但其内容不是的结构,如:
void
struct foo;
然后,您可以使用指向此类结构的指针(例如,您可以定义指针 struct foo *p; 但是,编译器不会知道这些结构的大小或内容,所以它不能帮助你分配它们,管理它们的数组,或者除了通过传递指针并询问外部例程(它们知道内容)之外使用它们。 )。
struct foo *p;
通常,在一个模块中的C例程和另一个模块中的C例程之间的操作中:
struct foo *
struct foo { /* various things */ };
由于您在C和Ada之间进行交互,因此必须由C和Ada实现提供这些交互的规则。
从将Ada绑定写入C库的角度来看,您使用的Ada Convention-C访问类型无关紧要 void* 指定。除了将它们传递给导入的C函数之外,您永远不会对该类型的对象执行任何操作。我经常使用
void*
type Void_Ptr is access all Integer; pragma Convention (C, Void_Ptr);