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

时间:2014-12-31 11:07:47

标签: c language-lawyer forward-declaration

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

  

如果可以声明库函数而不参考a中定义的任何类型   标题,也允许声明该函数并使用它而不包括它   相关标题。

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

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

/* my code here */

答案 1 :(得分:0)

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

double atof(const char *);

int main() {
    double t = atof("13.37");
    return 0;
}

#include <stdio.h>

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

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

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

这在c15标准,n1570第7.1.4节第2段

中规定

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