Турбо С: руководство пользователя. Часть 2

Турбо С: руководство пользователя. Часть 2 - Стр. 32

Печать PDF
Индекс материала
Турбо С: руководство пользователя. Часть 2
Стр. 2
Стр. 3
Стр. 4
Стр. 5
Стр. 6
Стр. 7
Стр. 8
Стр. 9
Стр. 10
Стр. 11
Стр. 12
Стр. 13
Стр. 14
Стр. 15
Стр. 16
Стр. 17
Стр. 18
Стр. 19
Стр. 20
Стр. 21
Стр. 22
Стр. 23
Стр. 24
Стр. 25
Стр. 26
Стр. 27
Стр. 28
Стр. 29
Стр. 30
Стр. 31
Стр. 32
Стр. 33
Стр. 34
Стр. 35
Стр. 36
Стр. 37
Стр. 38
Стр. 39
Стр. 40
Стр. 41
Стр. 42
Стр. 43
Стр. 44
Стр. 45
Стр. 46
Стр. 47
Стр. 48
Стр. 49
Стр. 50
Стр. 51
Стр. 52
Стр. 53
Стр. 54
Стр. 55
Стр. 56
Все страницы
          Модификатор signed противоположен unsigned и явно указывает,          
     что величина со знаком.  Данный модификатор используется  преиму-          
     щественно для документирования и придания законченного вида прог-          
     раммам. Однако,   если вы компилируете программу,   используя  по          
     умолчанию беззнаковый тип char (вместо знакового),  то нужно  ис-          
     пользовать модификатор signed, для того чтобы определить перемен-          
     ную или функцию типа signed char.  Модификатор signed,  использо-          
     ванный сам по себе, означает signed int, также как и unsigned оз-          
     начает unsigned int.                                                       
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
          Модификатор const                                                     
     -----------------------------------------------------------------          
                                                                                
          Модификатор const,  по определению стандарта ANSI, не допус-          
     кает каких бы то ни было переопределений собственных значений или          
     других косвенных изменений,  таких как увеличение или уменьшение.          
     Указатель типа const не может быть модифицирован,  в  отличии  от          
     самого объекта,   который он определяет.  Замечание:  модификатор          
     const, используемый сам по себе, эквивалентен const int. Рассмот-          
     рим следующие примеры:                                                     
                                                                                
          const float pi          = 3.1415926;                                  
          const       maxint      = 32767;                                      
          char *const str         = "Hello, world";  /* Указатель типа          
                                                              const */          
          char const  *str2       = "Hello, world";  /* Указатель на            
                                                           строку типа          
                                                              const */          
                                                                                
          Приведенные ниже утверждения недопустимы:                             
                                                                                
          pi  = 3.0;              /* Присвоение значения константе */           

                         - 261,262 -
                                                                                
                                                                                
          i   = maxint--;                  /* Уменьшение константы */           
          str = "Hi, there!";          /* Переназначение указателя */           
                                                                                
          Заметим,  однако, что вызов функции strcpy(str,"Hi, there!")          
     допустим,  поскольку  выполняет  посимвольное  копирование строки          
     символов  "Hi, there!" в область памяти, определяемую str.                 
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
          Модификатор volatile                                                  
     -----------------------------------------------------------------          
                                                                                
          Модификатор volatile,   также  определенный стандартом ANSI,          
     почти полная противоположность const.  Он указывает,  что  объект          
     может быть изменен не только вами, а также и чем-нибудь вне вашей          
     программы, например, программой прерываний или портом ввода/выво-          
     да. Объявление объекта как volatile предупреждает компилятор, что          
     не нужно делать предположений относительно значения  объекта,   в          
     тот момент когда оцениваются содержащие его выражения,  т.к. зна-          
     чение может (теоретически)  измениться в любое время. Кроме того,          
     volatile запрещает также компилятору использовать вместо перемен-          
     ных регистровые переменные.                                                
                                                                                
                                                                                
          volatile int ticks;                                                   
          interrupt timer();                                                    
          {                                                                     
               ticks++;                                                         
          }                                                                     
                                                                                
          wait (int interval)                                                   

                         - 263,264 -
                                                                                
                                                                                
          {                                                                     
               ticks = 0;                                                       
               while(ticks 
     что компилятор   с высоким уровнем оптимизации может не загрузить          
     значение ticks внутри цикла while, т.к. цикл не изменяет значения          
     ticks.                                                                     
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
          Модификаторы cdecl и pascal                                           
     -----------------------------------------------------------------          
                                                                                
          Турбо Си позволяет вызывать из  вашей  программы  программы,          
     написанные на других языках, и наоборот. При смешивании языков вы          
     должны умело обращаться с двумя важными объектами:  идентификато-          
     рами и передаваемыми параметрами.                                          
                                                                                
          При компиляции программы Турбо Си,  все глобальные идентифи-          
     каторы программы,  т.е.  имена функций и  глобальные  переменные,          
     сохраняются в объектном коде для последующей компоновки. По умол-          
     чанию эти идентификаторы записываются в оригинальном виде, (т.е в          
     соответствии с  состоянием регистра - заглавный,  строковый или и          
     тот, и другой). Кроме того, символ подчеркивание (_) предшествует          
     идентификатору, если    вы  не  использовали  опцию  -u(Generated          
     underbars...OFF).                                                          
                                                                                
          Аналогично,  все внешние  идентификаторы, объявленные вами в          
     программе,  остаются в  том  же  самом  формате.  Компоновщик (по          
     умолчанию) различает регистры клавиатуры, поэтому идентификаторы,          
     используемые в различных исходных файлах, должны точно соответст-          
     вовать и по орфографии, и по регистрам клавиатуры.                         

                         - 265,266 -
                                                                                
                                                                                
          pascal                                                                
     -----------------------------------------------------------------          
                                                                                
          В определенных ситуациях,  например, при использовании кода,          
     написанного на  других  языках,  описанный  выше метод сохранения          
     имен, применяемый по умолчанию, может вызвать ряд проблем.                 
                                                                                
          Турбо Си  дает  вам путь для обхода этих проблем.  Вы можете          
     объявить любой идентификатор как идентификатор типа pascal.   Это          
     означает, что идентификатор преобразуется к верхнему регистру и к          
     нему не добавляется символ подчеркивания. (Если идентификатор яв-          
     ляется функцией,  то данное правило распространяется и на переда-          
     ваемые параметры; см.  "Модификаторы типа функций" для более  де-          
     тального понимания.)   При этом используемый вами в исходном коде          
     регистр не учитывается,  т.к.  на  этапе  компоновки  применяется          
     только верхний регистр.                                                    
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
          cdecl                                                                 
     -----------------------------------------------------------------          
                                                                                
          Установив при компиляции опцию -p (соответствующую стандарт-          
     ному Паскалю),  вы можете сделать все глобальные идентификаторы в          
     исходном файле типа pascal.  Однако затем вы можете захотеть ука-          
     зать, что  некоторые идентификаторы чувствительны  к  регистру  и          
     впереди имеют знак подчеркивания, особенно, если это Си идентифи-          
     каторы из другого файла.                                                   
                                                                                
          В этом случае вы можете сделать объявление этих  идентифика-          
     торов как cdecl,  (что также будет влиять и на передачу в функцию          
     параметров).                                                               
                                                                                
          Вы можете заметить,  например,  что все функции в заголовках          
     файлов (stdio.h и др.) имеют тип cdecl. Это дает возможность про-          
     вести компоновку с библиотечными программами, если вы используете          
     опцию -p при компиляции.                                                   
                                                                                
          Для  выяснения деталей  смотрите  раздел  10.1.1  K&R в этой          
     главе, а также главу 12.                                                   
                                                                                

                         - 267,268 -
                                                                                
          Модификаторы near, far и huge                                         
     -----------------------------------------------------------------          
                                                                                
          Турбо Си имеет три модификатора, воздействующих на косвенный          
     оператор (*),  и,  тем самым, модифицирующих указатели на данные.          
     Речь идет о near, far и huge. Назначение этих ключевых слов более          
     детально объясняется  в главе 12, а здесь дается лишь краткий об-          
     зор.                                                                       
                                                                                
          Турбо Си позволяет использовать при компиляции одну из  нес-          
     кольких моделей памяти. Модель, которую вы используете, определя-          
     ет (среди прочих деталей) внутренний формат указателей на данные.          
     Если вы  используете малую модель памяти (tiny,  small,  medium),          
     все указатели имеют длину только 16 бит и задают смещение относи-          
     тельно регистра сегмента данных (DS). Если вы используете большую          
     модель (compact, large, huge), все указатели на данные имеют дли-