por*_*ton 4 c struct ada is-empty
http://c0x.coding-guidelines.com/6.7.2.1.html:
1401 如果结构声明列表不包含命名成员,则行为未定义。
这是否意味着以下内容是非法的?
struct C { };
Run Code Online (Sandbox Code Playgroud)
或者是什么意思?
我使用了一个Convention=>C指向空结构(实际上是空的 Ada 记录)的Ada 指针来代替void*我的 C 库绑定(因为void*Ada 中没有)。我想知道这是否不正确。
我有什么误解?
另请参阅“不要将没有非零大小字段的结构传递或返回给 extern (C) 函数。根据 C11 6.7.2.1p8,这是未定义的行为。” 在https://dlang.org/spec/struct.html
C 中很少是非法的,这意味着您不能这样做。相反,C 标准并未定义许多事情,这意味着,如果您执行这些操作,C 标准不会说明会发生什么。没有命名成员的结构就是这样。
C 2018 6.7.2.1 8 部分说:
如果 struct-declaration-list 不直接或通过匿名结构或匿名联合包含任何命名成员,则行为未定义。
如果您需要某些东西作为“未知类型”并且不想使用void,那么您可以声明一个结构,其标签已知但其内容未知,如下所示:
struct foo;
Run Code Online (Sandbox Code Playgroud)
然后你可以使用指向这些结构的指针(例如,你可以定义一个指针struct foo *p;),但是编译器不会知道这些结构的大小或内容,因此它无法帮助你分配它们、管理它们的数组或以其他方式使用它们除了通过传递指针和询问外部例程(它们确实知道内容)之外。
通常,在一个模块中的 C 例程和另一模块中的 C 例程之间的操作中:
struct foo *)。struct foo { /* various things */ };,并且它会在这个结构上为第一个模块执行服务。由于您在 C 和 Ada 之间进行交互,因此这些交互的规则必须由您的 C 和 Ada 实现提供。
| 归档时间: |
|
| 查看次数: |
1976 次 |
| 最近记录: |