.c vs .cc vs.cpp vs .hpp vs .h vs .cxx [重复]

Posted

技术标签:

【中文标题】.c vs .cc vs.cpp vs .hpp vs .h vs .cxx [重复]【英文标题】:.c vs .cc vs. .cpp vs .hpp vs .h vs .cxx [duplicate] 【发布时间】:2011-07-07 11:44:28 【问题描述】:

可能的重复:*.h or *.hpp for your class definitionsCorrect C++ code file extension? .cc vs .cpp

我曾经认为它曾经是这样的:

.h 文件是 C 和 C++ 的头文件,通常只包含声明。 .c 文件是 C 源代码。 .cpp 文件是 C++ 源代码(也可以是 C 源代码)。

然后像.hpp.cc.cxx 这样的文件出现了,我完全糊涂了……它们之间有什么区别?你什么时候用“新”的?

【问题讨论】:

我更喜欢 .cxx 而不是 .cpp 以与 makefile 约定保持一致(请参阅 gnu.org/software/make/manual/html_node/Implicit-Variables.html ) 我同意克里斯托夫的观点。很长一段时间以来,我认为 Makefiles 中的 CPPFLAGS 是用于将编译器标志传递给 C++ 编译器(而不是 C 编译器)。 CPPFLAGS 实际上将标志传递给 C 预处理器,这意味着它也可能会影响您的 C 代码。最终,我了解到 CXXFLAGS 是正确的 Makefile 变量,用于将标志传递给 C++ 编译器。 你们中的一个人应该添加该建议作为答案。结合@AProgrammer 的回答,它提出了一个非常具体的建议。 @Christoph Counterpoint:为.cc.C.cpp 制定隐含规则,但不是.cxx。 gnu.org/software/make/manual/html_node/… 【参考方案1】:

从历史上看,用于 C++ 的第一个扩展名是 .c.h,与 C 完全相同。这导致了实际问题,尤其是 .c,它不允许构建系统轻松区分 C++ 和 C 文件。

已开发 C++ 的 Unix 具有区分大小写的文件系统。所以有些人将.C 用于C++ 文件。其他使用.c++.cc.cxx.C.c++ 的问题是它们在其他文件系统上不可用,并且它们的使用迅速下降。 DOS 和 Windows C++ 编译器倾向于使用.cpp,其中一些编译器即使不是不可能也很难选择。考虑到可移植性,这种选择成为最常见的选择,即使在 MS-Windows 之外也是如此。

标头使用了对应的.H.h++.hh.hxx.hpp。但与主文件不同,.h 直到今天仍然是 C++ 的流行选择,尽管它的缺点是它不允许知道标头是否可以包含在 C 上下文中。标准标头现在根本没有扩展名。

此外,有些人使用.ii.ixx.ipp.inl 用于提供内联定义的标题和.txx.tpp.tpl 用于模板定义。它们要么包含在提供定义的标题中,要么在需要它们的上下文中手动包含。

编译器和工具通常不关心使用了哪些扩展,但使用与 C++ 关联的扩展可以避免跟踪如何配置它们以便正确识别所使用的语言。

2017 年编辑:Visual Studio 的实验模块支持将.ixx 识别为模块接口的默认扩展,clang++ 识别.c++m.cppm.cxxm 用于相同目的。

【讨论】:

关于.ii 的注释:.i.ii 是 GCC 和可能的其他编译器使用的默认扩展,分别用于 预处理 C 和 C++ 源,不一定是内联标题定义。如果您要求 GCC 使用 -E 开关对源进行预处理,您会得到一个 .i.ii 文件,然后可以将其输入到 gcc -c 进行编译。 在第一段中你两次提到.c++ @Luke_,在.cxx.C之间有一个句号。 @AProgrammer LOLOL 我很抱歉【参考方案2】:

这些扩展并不是新的,它们是旧的。 :-)

当 C++ 刚出现时,有些人希望源文件具有 .c++ 扩展名,但这在大多数文件系统上都行不通。所以他们尝试了类似的东西,比如 .cxx 或 .cpp。

其他人考虑了语言名称,并在某些情况下“递增” .c 以获得 .cc 甚至 .C。没听懂那么多。

有些人认为,如果源是 .cpp,则标头应该是 .hpp 才能匹配。比较成功。

【讨论】:

【参考方案3】:

真的没关系。 如果将 .c 提供给 c++ 编译器,它将编译为 cpp,.cc/.cxx 只是某些编译器使用的 .cpp 的替代品。

.hpp 试图区分存在显着 c 和 c++ 差异的头文件。一个常见的用法是 .hpp 具有必要的 cpp 包装器或命名空间,然后包含 .h 以便将 c 库同时暴露给 c 和 c++。

【讨论】:

我还要注意 .cc 在类 UNIX 系统上更常见(但无论如何都不是“标准”),而 .cpp 在 Windows 系统上更常见。至少在我的观察中。 我以为 Sun 的 c++ 编译器使用了 .cc 但我找不到参考。【参考方案4】:

我对 C++ 头文件使用“.hpp”,对 C 语言头文件使用“.h”。 “.hpp”提醒我该文件包含以下语句 对 C 语言无效的 C++ 语言,例如 作为“类”声明。

【讨论】:

【参考方案5】:

谈到 .hpp 扩展名,当人们应该知道这个头文件包含 C++ 而不是 C 时,我发现它很有用,例如使用命名空间或模板等,当他们看到这些文件时,他们就不会尝试将其提供给 C 编译器! 我还喜欢将不仅包含声明还包含实现的头文件命名为 .hpp 文件。比如包含模板类的头文件。虽然这只是我的意见,当然它不应该是正确的! :)

【讨论】:

【参考方案6】:

一般来说,.c 和 .h 文件用于 C 或 C 兼容代码,其他都是 C++。

许多人更喜欢对 C++ 文件使用一致的配对:.cpp 与 .hpp、.cxx 与 .hxx、.cc 与 .hh 等。我个人更喜欢 .cpp 和 .hpp。

【讨论】:

以上是关于.c vs .cc vs.cpp vs .hpp vs .h vs .cxx [重复]的主要内容,如果未能解决你的问题,请参考以下文章

vs cpp文件在哪里,建的项目写了c++,但是在项目文件目录里找不到cpp文件

VS CPP项目:是不是可以链接DLL形成一个exe文件

#include <opencv2/opencv.hpp> 在 VS 2013 中不起作用

C vs C++?,C++基础教程之C++与C的区别

如何用DW设计界面 结合 VS设计后台代码

vs2013无法用opencv加载图片