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

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

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

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

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

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

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

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

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

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

这曾经很常见。 我认为这里的原因是硬盘驱动器速度慢,而#include更少意味着更快的编译时间。 但这不再是20世纪80年代了,而且我们都拥有快速的CPU和快速的硬盘驱动器,因此一些#include甚至都没有被注意到。

 void *malloc(size_t); void abort(void); /* my code here */ 

是的,你可以这完全有效。 这也可以通过标准库完成。

 double atof(const char *); int main() { double t = atof("13.37"); return 0; } #include  

结构,变量等可以完成类似的事情。

我建议你阅读wiki页面,其中包含一些c示例:

http://en.wikipedia.org/wiki/Forward_declaration

这在n1570的c标准第7.1.4节第2段中规定

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