C语言中.h文件和.inc文件的区别

12

我一直在研究各种开源项目,发现有许多C语言文件的文件扩展名为.inc。根据我的观察,它们似乎像头文件一样被使用。

我认为标准惯例是使用.h文件作为头文件,而将.c用于源文件。那么,何时应将头文件命名为.inc文件而不是.h文件?还是这只是在每个项目基础上决定的呢?(或者我只是在看使用.inc的奇怪项目?)


1
惯例只是惯例。并没有规定头文件必须使用.h扩展名,或者实现文件必须使用.c扩展名(尽管大多数编译器和IDE都希望你遵循这个惯例)。话虽如此,在我的经验中,使用.inc作为头文件扩展名是不寻常的。 - John Bode
4
一个 .inc 文件不是头文件。它可以用来包含一个大的已定义数组,只是为了将其放在源文件编辑之外。 - Weather Vane
2
@JohnBode 当然这只是一种约定 ;) 但实际上了解这些约定仍然是有用的。 - Leif Andersen
@WeatherVane 哦,好的,谢谢。 - Leif Andersen
5
这样的一个.inc文件可能是生成的而不是手动输入的。在这种情况下,生成程序只需要编写最小化的开销使其可用作源代码。然后程序员就不必在每次调整数据时进行复制/粘贴。 - Weather Vane
显示剩余5条评论
2个回答

10
标准惯例是使用.h作为仅包含宏定义和其他声明的头文件的扩展名,而将包含代码和数据定义的C源文件的扩展名设置为.c
在一些项目中,代码片段被存储在单独的文件中,并通过某些宏技巧包含在C源文件中,以便在不同文件或情况下扩展。有时,在同一源文件中甚至会多次包含这些文件。为了强调与这些文件相关的特殊语义,给它们赋予一个不同的扩展名可能是一个有用的提示。这些文件也可能是构建过程的一部分:对它们进行具体命名可以避免与实际源文件混淆。
查看你在这些项目中遇到的文件,验证该说明是否符合要求。

6

.inc文件通常与模板类和函数相关联。

标准类和函数是通过.h文件声明并通过.cpp文件定义的。但是,模板既不是类也不是函数,而是用于生成一组类或函数的模式。为了让编译器生成模板的代码,它需要看到声明和定义,因此两者都必须包含在.h文件中。

为了保持声明和定义的分离,将定义放在自己的文件中,并在.h文件的末尾进行包含。这个文件可能有多个可能的文件扩展名,如.inc.imp.impl.tpp等。

声明示例:

// Foo.h
#ifndef FOO_H
#define FOO_H

template<typename T>
class Foo {
public:
    Foo();
    void DoSomething(T x);
private:
    T x;
};

#include "Foo.inc"
#endif // FOO_H

定义示例:

// Foo.inc
#include "Foo.h"

template<typename T>
Foo<T>::Foo() {
    // ...
}

template<typename T>
void Foo<T>::DoSomething(T x) {
    // ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接