【发布时间】:2019-07-17 17:12:17
【问题描述】:
今天我读到了这个问题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-Za-z)和下划线_。
它完全没有提到/,这意味着禁止使用路径,更不用说文件名中的点或连字符了。
为了首先测试这个,我写了一个简单的程序,在同一目录tst/中包含一个源文件test.c和一个头文件_1.2-3~a.hh:
// 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>
我用这个选项编译的:$ gcc -std=c11 -pedantic-errors test.c -o tst,编译器没有抱怨(我有gcc (Debian 8.2.0-8) 8.2.0)。
- 真的禁止在包含中使用相对路径吗?
【问题讨论】:
-
不禁止使用
/,但这样做的结果是实现定义的。几乎所有关于<和>之间或"和"之间的序列在#include指令中都是实现定义的。该标准规定,如果您使用诸如abcdefgh.h之类的名称,则需要实现将其作为唯一名称进行处理(不区分大小写且不使用数字代替a)。实现可能区分大小写;它可能允许其他字符——这些细节是实现定义的,这意味着实现必须记录它的规则。