путь: действительный или нет в `# include`? - PullRequest
0 голосов
/ 24 февраля 2019

Сегодня я читаю этот вопрос Есть ли какие-либо правила, касающиеся подчеркивания в именах файлов в 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).

  • Действительно ли запрещено использоватьотносительный путь во включаемом файле?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Я бы сказал, что это не запрещено, но не рекомендуется, поскольку в некоторых случаях он не будет компилироваться.

Например:

  • , если вы клонируете этот каталог в свойroot (так что у вас будет C:\test\).
  • , если вы попытаетесь запустить его в виртуальной среде онлайн, у вас могут возникнуть проблемы.

Действительно ли этозапрещено использовать путь во включении?

Не уверен, что вы имеете в виду здесь: относительные пути обычно используются, но использование абсолютного пути было бы глупо.

0 голосов
/ 24 февраля 2019

ч;стандарт действительно говорит о минимальном наборе символов файловой системы, поддерживающей компилятор C.

Все, что находится в "" (или <> с некоторой предварительной обработкой в ​​первую очередь), анализируется как строка в соответствии с обычными правилами C и передаетсяоттуда в ОС делать с ней все, что захочет.

Это приводит к ошибкам компилятора в Windows, когда программист забывает набрать \\ вместо '\' при записи пути в заголовочные файлы.В современных Windows мы можем просто использовать '/' и ожидать, что он будет работать, но в старых Windows или DOS это не сработало.

Для дополнительного удовольствия попробуйте

#include "/dev/tty"

Действительно хороший вариант.Он хочет, чтобы вы набирали код C во время компиляции.

...