Source files
SF.13
Используйте переносимые идентификаторы заголовков в директивах `#include`
Причина
Стандарт не указывает, как компиляторы уникально находят заголовки по идентификатору в директиве #include, и не определяет, что составляет уникальность. Например, учитывает ли реализация идентификаторы регистрозависимыми, являются ли идентификаторы путями файловой системы к заголовочному файлу, и если да, то как разделяется иерархический путь файловой системы.
Для максимальной переносимости директив #include между компиляторами рекомендуется:
- использовать регистрозависимость для идентификатора заголовка, соответствующую тому, как заголовок определён стандартом, спецификацией, реализацией или файлом, предоставляющим заголовок;
- когда идентификатор заголовка является иерархическим путём файла, использовать прямой слэш
/для разделения компонентов пути, так как это наиболее широко принятый разделитель пути.
Пример
// good examples
#include <vector>
#include <string>
#include "util/util.h"
// bad examples
#include <VECTOR> // bad: the standard library defines a header identified as <vector>, not <VECTOR>
#include <String> // bad: the standard library defines a header identified as <string>, not <String>
#include "Util/Util.H" // bad: the header file exists on the file system as "util/util.h"
#include "util\util.h" // bad: may not work if the implementation interprets `\u` as an escape sequence, or where '\' is not a valid path separator
Контроль
Применимо только на реализациях с регистрозависимыми идентификаторами заголовков, поддерживающих только / в качестве разделителя пути файла.