今天我读了这个问题Any rules about underscores in filenames in C/C++?, 我发现非常有趣的是,该标准似乎不允许许多图书馆通常看到的内容(我也通过这种方式在我的个人图书馆中这样做):
例如,在opencv
中,我们可以看到以下内容:
// File: opencv/include/opencv2/opencv.hpp
#include "opencv2/opencv_modules.hpp"
但是标准说:
§6.10.2包含源文件
语义
5实现应提供序列的唯一映射 由一个或多个非数字或数字(6.4.2.1)组成,后跟一个 句点(
.
)和一个非数字。第一个字符不得为 一个数字。该实现可能会忽略字母顺序上的区别 大小写并将映射限制为八个有效字符 时期。
nondigit
表示字母(A
-Z
a
-z
)下划线_
。
它与/
完全无关,这意味着禁止使用路径,更不用说文件名中的点或连字符了。
首先要进行测试,我编写了一个简单程序,在同一目录test.c
中包含源文件_1.2-3~a.hh
和头文件tst/
:
// File: test.c
#include "./..//tst//./_1.2-3~a.hh"
int main(void)
{
char a [10] = "abcdefghi";
char b [5] = "qwert";
strncpy(b, a, 5 - 1);
printf("b: \"%c%c%c%c%c\"\n", b[0], b[1], b[2], b[3], b[4]);
/* printed: b: "abcdt" */
b[5 - 1] = '\0';
printf("b: \"%c%c%c%c%c\"\n", b[0], b[1], b[2], b[3], b[4]);
/* printed: b: "abcd" */
return 0;
}
// File: _1.2-3~a.hh
#include <stdio.h>
#include <string.h>
我使用以下选项进行了编译:{{1}},编译器没有任何抱怨(我有$ gcc -std=c11 -pedantic-errors test.c -o tst
)。