http://c0x.coding-guidelines.com/6.7.2.1.html :
1401 If the struct-declaration-list contains no named members, the behavior is undefined.
这是否意味着以下内容是非法的?
struct C { };
或者是什么意思?
我使用 Convention=>C
Ada 指针指向一个空结构(实际上是空的 Ada 记录)来代替 void*
在我的 C 库绑定(bind)(因为 Ada 中没有 void*
)。我想知道这是否不正确。
我误会了什么?
另请参阅“不要将没有非零大小字段的结构传递或返回给外部 (C) 函数。根据 C11 6.7.2.1p8,这是未定义的行为。”在 https://dlang.org/spec/struct.html
最佳答案
在 C 中很少有非法的,这意味着你不能这样做。相反,C 标准没有定义很多事情,这意味着,如果您执行它们,C 标准并没有说明会发生什么。没有命名成员的结构就是这样。
C 2018 6.7.2.1 8 部分说:
If the struct-declaration-list does not contain any named members, either directly or via an anonymous structure or anonymous union, the behavior is undefined.
如果您需要某些东西作为“未知类型”并且不想使用 void
,那么您可以声明一个结构,其标签已知但其内容未知,如:
struct foo;
然后你可以使用指向此类结构的指针(例如,你可以定义一个指针struct foo *p;
),但编译器将不知道此类结构的大小或内容,因此它无法帮助您分配它们、管理它们的数组或以其他方式使用它们,除非通过传递指针和询问外部例程(它们知道内容)。
通常,在一个模块中的 C 例程与另一模块中的 C 例程之间的操作中:
- 在一个不知道结构内容的源模块中,您可以使用指针 (
struct foo *
)。 - 另一个源模块(通常是某种软件库)会知道结构的内容。它会在自己的源代码中用
struct foo {/* various things */};
定义完整的结构,并会在这个结构上为第一个模块执行服务。 - 在两个这样的 C 模块之间,C 标准的规则将定义行为。
由于您在 C 和 Ada 之间进行交互,因此这些交互的规则必须由您的 C 和 Ada 实现提供。
关于c - C中的空结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53952097/