Текущий раздел:

Описания RDS

Приложения

Приложение А. Функции, константы и структуры RDS

А.1. Типы параметров

А.1.4. Сервисные функции со строковыми параметрами и результатом

# Приложения

## Приложение А. Функции, константы и структуры 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);

См. также

Доступ к сервисным функциям RDS.