关于 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.c
和 Foo.c
可能会也可能不会命名相同的文件。后者对于 foo.c
与 foo.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
...
- 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 源文件包含。
除此之外,有效文件名的传递取决于操作系统、文件系统、编译器、链接器和编译工具链的其他部分。
如今,我希望大多数现代系统都允许文件系统未直接禁止的几乎所有内容。
参考资料
我知道有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.c
和 Foo.c
可能会也可能不会命名相同的文件。后者对于 foo.c
与 foo.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
...
- 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 源文件包含。
除此之外,有效文件名的传递取决于操作系统、文件系统、编译器、链接器和编译工具链的其他部分。
如今,我希望大多数现代系统都允许文件系统未直接禁止的几乎所有内容。