.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文件