c - C中的空结构

标签 c struct ada is-empty

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/

相关文章:

C# 可空值类型产生垃圾?

Ada Gnat 项目,其中包含针对不同构建配置的不同名称的文件

c - 获得 Windows 控件首选大小的正确方法

c - 如何强制autoconf不定义宏?

c - 对内核模块导出函数的 undefined reference

matrix - Ada 中的 HowTo 和多维矩阵

winapi - GetRawInputDeviceList 失败并出现错误 87(参数不正确)

c - 当输入是二进制数时,如何反转二进制数并打印它们?

c++ - 将 TCHAR 转换为 strstr 函数的 char*

swift - 更改关联枚举的值