在C标准库中转发声明实体?

Pra*_*tic 3 c forward-declaration language-lawyer

转发C标准库提供的结构和函数是否合法?

我的背景是C++,答案是否定的.这样做的主要原因是C++标准库强制要求的结构或类可以是幕后模板,并且可能具有"秘密"模板参数,因此无法使用天真的非模板声明正确声明.即使用户确实弄清楚如何在特定实现的特定版本中转发声明特定实体,实现也没有义务在未来版本中不破坏该声明.

我手头没有任何C标准的副本,但显然C中没有模板.

那么在C标准库中转发声明实体是否合法?

C++标准库中的实体可能无法向前声明的另一个原因是实现提供的头文件不需要遵循常规规则.例如,在最近的一个问题中,我询问实现提供的C++头是否需要是一个实际文件而答案是否定的.我不知道是否有任何适用于C.

C和C++都使用C标准库,但对于这个问题,我只问C.

Die*_*Epp 5

结构的前向声明在C中始终是允许的.但是,这种方式不能使用很多类型.例如,您不能仅使用前向声明,FILE因为未指定结构的标记名称(理论上,它可能根本不是结构).

n1570的第7.1.4节第2段允许您对功能执行相同的操作:

如果可以在不引用标头中定义的任何类型的情况下声明库函数,则允许声明该函数并使用它而不包括其关联的标头.

这曾经相当常见.我认为这里的推理是硬盘驱动器速度慢,而更少的驱动器#include意味着更快的编译时间.但这不再是20世纪80年代了,而且我们都有快速的CPU和快速的硬盘驱动器,所以有些#include人甚至都没有注意到.

void *malloc(size_t);
void abort(void);

/* my code here */
Run Code Online (Sandbox Code Playgroud)

  • @mafso:结构的前向声明意味着只指定结构的名称但不完成类型,例如,`struct timespec;`,前向声明中没有其他内容,所以你不能搞砸它. (2认同)