6

在 Java 中,编译器需要为您的文件命名<Classname>.java。在 C 中,文件名是什么重要吗?

4

6 回答 6

15

不,源文件原则上可以称为任何东西。但是,为了便于阅读,名称应该反映文件的内容。头文件也不必和相应的源文件一样被调用他们应该

于 2013-08-23T16:08:36.797 回答
3

根据C89 草案标准(但更新的标准也存在类似的限制),第3.8.2节:

在定界序列和外部源文件名之间应该有一个实现定义的映射。实现应为由一个或多个字母(如 2.2.1 中定义)后跟句点 (.) 和单个字母组成的序列提供唯一映射。该实现可以忽略字母大小写的区别,并将映射限制为句点前的六个有效字符。

因此,实现可能会对包含文件的名称造成一些限制,并且这些限制很可能对任何源文件(不仅是#included 文件)也有效。

在现代实现中,文件名长度的限制不应该太严格,但在命名源文件时我会坚持使用纯 ASCII。无论如何,您选择的编译器的文档应该提到可能的限制。

附录:根据附件 J(可移植性问题)中的最新 C99 草案(ISO-IEC 9899-TC3,又名WG14/N1256),有(强调我的):

J.3 实现定义的行为

一个符合要求的实现需要记录它在本小节中列出的每个领域中的行为选择。以下是实现定义的:
[...]

J.3.11 预处理指令

[...]
- 两种形式的标题名称中的序列如何映射到标题或外部源文件名 (6.4.7)。

这也证实了我上面对 C99 的陈述:实现可能会对有效的源文件名施加限制(并且必须记录哪些)。

于 2013-08-23T16:27:44.517 回答
1

唯一的限制似乎是要#include编辑的文件只能包含来自Source Character Set的字符,即允许写入实际源代码的字符集。

所以要扭转这种局面:如果你没有#include文件 C 不会对命名施加任何限制。

有关详细信息,请参阅 C 标准 6.4.7 和 5.2.1(用于源字符集)。

于 2013-08-23T16:21:00.397 回答
1

不,文件中的任何内容都不需要与文件名匹配。然而,一些 C 编译器不喜欢不以几个扩展名之一结尾的名称。例如,GCC 尝试通过查看扩展名 .c 来检测文件是 C 还是 C++大写 C 与早期的小写 c)、.cc .cpp、.cxx、.ii(如 .i 仅用于 C++)以及更多用于 C++。

于 2013-08-23T16:14:30.653 回答
0

不,在 C 语言中这不是必需的,但为了便于阅读,名称文件必须包含与其内容相关的名称,并且它们必须是唯一的。

于 2013-08-23T16:25:10.167 回答
0

如果您将多个 C 文件编译成一个可执行文件,您需要确保每个文件都有自己唯一的名称。

于 2013-08-23T16:10:44.783 回答