在Java中,编译器需要为文件命名<Classname>.java
。在C中,文件名是什么意思?
答案 0 :(得分:15)
不,源文件原则上可以被调用。但是,名称应反映文件的内容以提高可读性。头文件也不会具有被调用与相应的源文件相同;他们只是应该。
答案 1 :(得分:3)
根据C89 draft standard(但更新标准也存在类似限制),3.8.2部分:
在分隔序列和外部源文件名之间应该有一个实现定义的映射。实现应为由一个或多个字母(如2.2.1中定义)组成的序列提供唯一映射,后跟句点(。)和单个字母。实现可以忽略字母大小写的区别,并在该句点之前将映射限制为六个重要字符。
因此,实施可能对所包含文件的名称构成一些限制,并且这些限制可能也适用于任何源文件(不仅是#include
d个)。
在现代实现中,文件名长度的限制不应该太严格,但在命名源文件时我会坚持使用纯ASCII。无论如何,您选择的编译器的文档应该提到可能的限制。
附录:根据附件J(可移植性问题)中的最新C99草案(ISO-IEC 9899-TC3,又名WG14/N1256),有(强调我的):
J.3实现定义的行为
需要符合要求的实施 来记录 其每个行为的选择 本子条款中列出的区域。以下是实施定义:
[...]J.3.11预处理指令
[...]
- 两种形式的标题名称中的序列如何映射到标题或外部 源文件名(6.4.7)。
这也证实了我上面对C99的陈述:实施可能对有效的源文件名施加限制(并且必须记录哪些文件)。
答案 2 :(得分:1)
不,文件中的任何内容都不需要与文件名匹配。但是,有些C编译器不喜欢不以多个扩展名之一结尾的名称。作为示例,GCC尝试通过查看已经通过预处理器运行的C的C .i的扩展名.c来检测文件是C还是C ++,因此不应再次通过C预处理器和.C(大写C vs早期的小写c),. cc .cpp,.cxx,.ii(比如.i仅适用于C ++)和C ++的更多内容。
答案 3 :(得分:1)
唯一的限制似乎是#include
ed的文件可能只包含来自源字符集的字符,即允许写入实际源代码的字符集。
所以要解决这个问题:如果你没有#include
文件C没有对命名进行任何限制。
详情请参阅C-Standard 6.4.7和5.2.1(源字符集)。
答案 4 :(得分:0)
如果要将多个C文件编译为一个可执行文件,则需要确保每个文件都有自己唯一的名称。
答案 5 :(得分:0)
不,在C语言中没有必要,但为了便于阅读,名称文件必须包含与其内容相关的名称,并且必须是唯一的。