include_alias
Указывает, что в качестве псевдонима для длинного_имени_файла должно использоваться краткое_имя_файла.
#pragma include_alias( "long_filename", "short_filename" )
#pragma include_alias( <long_filename>, <short_filename> )
Заметки
Некоторые файловые системы поддерживают более длинные имена файлов заголовков, чем допускается ограничением файловой системы FAT (8 символов в имени файла и 3 символа в расширении). Компилятор не может просто усечь более длинные имена до этого стандарта, поскольку первые восемь символов в длинных именах файлов заголовков могут быть неуникальными. Когда компилятор встречает строку длинное_имя_файла, он подставляет вместо нее строку краткое_имя_файла и выполняет поиск файла заголовка с кратким_именем_файла. Эта директива pragma должна располагаться до соответствующей директивы #include. Например:
// First eight characters of these two files not unique.
#pragma include_alias( "AppleSystemHeaderQuickdraw.h", "quickdra.h" )
#pragma include_alias( "AppleSystemHeaderFruit.h", "fruit.h" )
#pragma include_alias( "GraphicsMenu.h", "gramenu.h" )
#include "AppleSystemHeaderQuickdraw.h"
#include "AppleSystemHeaderFruit.h"
#include "GraphicsMenu.h"
Псевдоним должен точно соответствовать заданному имени как по написанию, так и по регистру. а также по использованию двойных кавычек и угловых скобок. Директива #pragma include_alias никак не проверяет имена файлов, а лишь сопоставляет строки в них. Рассмотрим директивы в следующем примере:
#pragma include_alias("mymath.h", "math.h")
#include "./mymath.h"
#include "sys/mymath.h"
В этом примере псевдоним не назначается (подстановка не выполняется), поскольку строки файлов заголовков совпадают не полностью. Кроме того, подстановка не выполняется в именах файлов заголовков, которые используются в качестве аргументов к параметрам компилятора, а также в директиве hdrstop. Например, представим, что исходный файл содержит следующую директиву:
#include <AppleSystemHeaderStop.h>
В этом случае должен использоваться следующий параметр компилятора:
/YcAppleSystemHeaderStop.h
С помощью директивы #pragma include_alias можно сопоставить любую пару имен файлов заголовков. Например:
#pragma include_alias( "api.h", "c:\version1.0\api.h" )
#pragma include_alias( <stdio.h>, <newstdio.h> )
#include "api.h"
#include <stdio.h>
Не смешивайте имена файлов в двойных кавычках с именами файлов, заключенными в угловые скобки. Например, в двух приведенных выше директивах #pragma include_alias компилятор не будет выполнять подстановку для следующих директив #include:
#include <api.h>
#include "stdio.h"
Кроме того, следующая директива вызовет ошибку:
#pragma include_alias(<header.h>, "header.h") // Error
Обратите внимание на то, что в сообщениях об ошибках и в значении предопределенного макроса __FILE__ используется имя файла после выполнения подстановки. Например, после применения следующих директив:
#pragma include_alias( "VeryLongFileName.H", "myfile.h" )
#include "VeryLongFileName.H"
в результате ошибки в файле VERYLONGFILENAME.H будет выведено следующее сообщение:
myfile.h(15) : error C2059 : syntax error
Также обратите внимание, что транзитивность не поддерживается. Рассмотрим следующий пример:
#pragma include_alias( "one.h", "two.h" )
#pragma include_alias( "two.h", "three.h" )
#include "one.h"
В этом случае компилятор будет искать файл TWO.H, а не THREE.H.