关于 C/C++ 文件名中下划线的任何规则?

Any rules about underscores in filenames in C/C++?

我知道有rules for using underscores in identifiers in C/C++。在源代码文件名中使用它们有什么规则吗?

例如,对于以下划线开头或结尾的文件名是否有任何限制?或者将下划线作为 .c.h 扩展名之前的最后一个字符?双下划线?

如果有参考文献,我们将不胜感激。

没有。文件可以随意命名(前提是底层 file-system 支持该名称)——C++ 和 C 标准都与此无关。 是的,标识符中有关于“_”的规则,但这不会延续到文件名等外部事物。

C 和 C++ 语言(请记住它们是两种不同的语言)都没有任何源文件名规则。两者都为其标准 header 指定名称,并遵循这些名称的某些约定,但这些约定不会强加于其他源文件。 (请注意,标准 header 甚至不一定作为文件实现。)

操作系统、文件系统、编译器或环境的其他部分可能会提出一些要求。

更具体地说,Unix-like 系统通常允许在文件名中使用 任何 个字符,但 '/'(这是目录路径分隔符)和 '[=11 =]'(这是字符串终止符),编译器通常允许任何有效的文件名(可能会注意扩展名以确定编译哪种语言)。 Windows 不允许使用其他一些字符。 Case-sensitivity 因系统而异; foo.cFoo.c 可能会也可能不会命名相同的文件。后者对于 foo.cfoo.C 可能很重要;有时 .C 用作 C++ 源代码的扩展。如果您的代码可能用于 case-insensitive 文件系统(Windows,MacOS),请使用其他东西。

有许多用于标识源文件内容的文件扩展名约定,例如 .c 用于 C 源代码,.h 用于 header 文件,.cpp.cc.cxx 用于 C++ 源代码,依此类推。请查阅编译器的文档。

如果源文件受预处理器 #include 指令的约束,则 C 和 C++ 标准对文件名指定了一组最低要求。 C标准说:

6.10.2 Source file inclusion

...

  1. The implementation shall provide unique mappings for sequences consisting of one or more nondigits or digits (6.4.2.1) followed by a period (.) and a single nondigit. The first character shall not be a digit. The implementation may ignore distinctions of alphabetical case and restrict the mapping to eight significant characters before the period.

... 其中 nondigit 包含字母 A-Z、a-z 和下划线 .

完全相同的文本(段落编号除外)也可以在 C++ 标准中找到,16.2 源文件包含

除此之外,有效文件名的传递取决于操作系统、文件系统、编译器、链接器和编译工具链的其他部分。

如今,我希望大多数现代系统都允许文件系统未直接禁止的几乎所有内容。

参考资料

  • C11 标准的最终 public 草案,n1570
  • C++11 标准的最终 public 草案,n3337