0

我在 Ubuntu 上使用带有 C++ 库的 g++,其头文件都恰好以 .H 而不是传统的 .h 结尾。

我宁愿不修改包含目录……否则我可能只会创建指向 .h 版本的标头的符号链接。

我想知道是否有一种简单的方法可以让 g++ 自动识别 .H 和 .h 文件是相同的,以便我可以在我的程序中编写 header.h 或 header.H ?我浏览了 g++ 手册页,但我很难判断它是否支持这样的功能。

4

5 回答 5

7

.H 是 C++ 头文件与 C 头文件(也是 .hpp 或 .hxx)不同命名的一种方式。这仅适用于区分大小写的操作系统。

如果文件有 .H,只需#include <file.H>

于 2009-06-04T15:55:37.603 回答
3

问题源于文件系统。您的文件系统区分大小写,因此会看到 header.h 和 header.H 之间的差异。这不是 g++ 问题。在不区分大小写的文件系统/操作系统上运行你不会看到这个问题,就像在 win32 系统上运行 g++ 时一样。

于 2009-06-04T15:52:31.443 回答
2

我认为这是Linux文件系统的一个实现细节。虽然在 Windows 上 .h 和 .H 文件实际上是相同的,但在 Linux 上,您可以在同一目录中拥有一个传统的.h 和一个传统的.H。

如果我对您的理解正确,您只需要在包含您的标题的文件中指定大写 H。

于 2009-06-04T15:52:26.637 回答
2

如果您不想重命名头文件或让源#include .H 文件,您可以创建一组 .h 文件,其中仅 #include 相应的 .H 文件。

于 2009-06-04T15:58:21.910 回答
2

我想不出任何简单的方法让 gcc 变得不区分大小写,所以你可能不得不咬紧牙关并使用替代解决方案,比如

#include "foo.H"

...或创建一些符号链接:

# create .h links to all .H files below the current dir
for basename in `find . -name *.H | sed 's/\(.*\)\..*/\1/'`; do
  ln -s $basename.H $basename.h
done

仅供参考,gcc 邮件列表中有一个最近的线程要求不区分大小写。响应主要与效率有关——如果您开始要求编译器查找“foo.h”的所有版本(例如“FOO.H”、“Foo.H”、“foo.H”),那么您将更频繁地访问磁盘。谁需要更长的构建时间?:)

于 2009-06-04T20:09:42.400 回答