Сегодня я читаю этот вопрос Есть ли какие-либо правила, касающиеся подчеркивания в именах файлов в 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>
, которые я скомпилировал с этими опциями: $ gcc -std=c11 -pedantic-errors test.c -o tst
без жалоб от компилятора (у меня gcc (Debian 8.2.0-8) 8.2.0
).
- Действительно ли запрещено использоватьотносительный путь во включаемом файле?