Приложения
Приложение А. Функции, константы и структуры RDS
А.1. Типы параметров
А.1.4. Сервисные функции со строковыми параметрами и результатом
Большинство сервисных функций RDS, принимающих и возвращающих строки, существует в двух вариантах: для работы с UTF8 (функция с суффиксом «A») и для работы с UTF16 (функция с суффиксом «W»). Имя без суффикса, совпадающее с именем функции в RDS версии 1.x, для совместимости со старой версией сделано макроопределением, которое принимает значение одного из имен с суффиксом в зависимости от наличия или отсутствия дополнительного определения RDS_UTF16DEFAULT. Имена функций, не имеющих дела со строками, суффиксов не имеют.
Рассмотрим для примера сервисную функцию RDS rdsAtoI, которая преобразует переданную строку в целое число. Она существует в двух вариантах:
int RDSCALL rdsAtoIA(const char *Str,int *pRadix); int RDSCALL rdsAtoIW(const wchar_t *Str,int *pRadix);
Функция rdsAtoIA обрабатывает строки в кодировке UTF8, функция rdsAtoIW – в кодировке UTF16. При этом в файл «RdsFunc.h» включены макроопределения следующего вида:
#if (!defined(RDS_NO_UTFALIASES)) && (!defined(RDS_UTF16DEFAULT)) … #define rdsAtoI rdsAtoIA … #endif #if (!defined(RDS_NO_UTFALIASES)) && defined(RDS_UTF16DEFAULT) … #define rdsAtoI rdsAtoIW … #endif
Как и в случае строковых полей структур, макроопределения констант RDS_NO_UTFALIASES и RDS_UTF16DEFAULT управляют описанием «псевдонимов» – в данном случае, для функций. Команды #define для них следует помещать в исходный текст модели перед включением файлов «RdsDef.h» и «RdsFunc.h».
Если программист хочет, чтобы по имени «rdsAtoI» вызывалась версия функции, обрабатывающая строки UTF8 (или ASCII – в части цифр, знаков препинания и латинских букв эти кодировки совпадают), то перед включением заголовков RDS никаких констант описывать не нужно:
#include <RdsDef.h> #include <RdsFunc.h> … int i=rdsAtoI("1234",NULL);
Если программист хочет, чтобы «rdsAtoI» вызывала версию функции, обрабатывающую строки UTF16, то перед включением заголовков RDS сдедует описать константу RDS_UTF16DEFAULT:
#define RDS_UTF16DEFAULT #include <RdsDef.h> #include <RdsFunc.h> … int i=rdsAtoI(L"1234",NULL);
(здесь префикс «L» перед строкой в кавычках указывает на то, что это строка в «расширенной» кодировке, т.е. в UTF16 при компиляции для Windows).
Если же программист вообще не хочет использовать псевдонимы функций (это затронет и псевдонимы полей служебных структур), то перед включением заголовков RDS следует описать константу RDS_NO_UTFALIASES:
#define RDS_NO_UTFALIASES #include <RdsDef.h> #include <RdsFunc.h> … int i1=rdsAtoIA("1234",NULL); int i2=rdsAtoIW(L"5678",NULL);
См. также