路径:是否在`#include`中有效?

时间:2019-02-23 22:29:26

标签: c path include filenames

今天我读了这个问题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)。

  • 真的禁止在include中使用相对路径吗?

0 个答案:

没有答案