我正在查看gcc的源代码(出于好奇),并且发现了一个以前从未在C中见过的数据结构。
在解析器中的行80和129(以及许多其他位置)上,它们似乎正在使用向量。
80: vec<tree> incomplete_record_decls;
129: ridpointers = ggc_cleared_vec_alloc<tree> ((int) RID_MAX);
我从未在C语言中遇到过这种数据类型,也从未遇到过< >
。它们是C原生的吗?
有人知道它们是什么以及如何使用吗?
答案 0 :(得分:9)
尽管文件名是.c,但此代码无效C。是使用该语言的template功能的C ++。如果检查gcc的构建过程,您会发现此文件实际上是使用C ++编译器编译的。
https://gcc.gnu.org/codingconventions.html
目录gcc,libcpp和fixincludes可以使用C ++ 03。如果主机C ++编译器支持,则它们也可以使用long long类型。这些目录应该使用C ++ 03的可移植部分,以便可以使用GCC本身以外的C ++编译器来构建GCC。如果测试显示合理的最新版本的非GCC C ++编译器无法编译GCC,则应相应地调整GCC代码。 (避免使用不寻常的语言构造会极大地帮助您。)此外,这些目录还应该与C ++ 11兼容。
请记住,尽管默认情况下编译器通常会 从文件名中推断出源文件的语言,但始终可以覆盖此默认文件。为此,完全可以在.c文件中包含C ++代码,或者在.bas文件中包含C代码。您可能只需要以其他方式告诉编译器正在使用哪种语言即可。
我希望gcc选择此文件命名约定,因为该代码最初是用C编写的,后来又转换为C ++,并且他们发现更改所有文件名非常麻烦。更新所有的makefile等将需要大量的工作。仅更改使用的编译器并向所有开发人员解释该约定可能就不那么麻烦了。当然,通常最好以标准方式命名文件,这是更好的编程习惯,但显然,海湾合作委员会开发人员认为,在这种情况下,这不是最佳的选择。
答案 1 :(得分:6)
自GCC 4.8起,GCC已从C移至C ++。实际上,这项工作早在creation of gcc-in-cxx
branch之前就已经开始了。开发人员首先尝试使用C ++编译器来编译源代码,因此没有任何名称更改。我猜他们以后merging the two branches并正式只有一个C ++分支时就不会再为文件重命名了
您可以阅读GCC's move to C++了解更多历史信息