Содержание

Основные элементы языка

Далее обсуждаются:

Наборы символов

Исходный набор символов содержит символы используемые во время трансляции исходного текста на C в объектный код. Набор символов времени исполнения содержит символы используемые во время исполнения программы. В большинстве случаев эти два набора совпадают, т.к. программа компилируется и исполняется на одинаковых машинах. Однако C иногда используется для кросс-компиляции, когда компиляция происходит на одной машине, а код генерируется для какой-либо другой. Если две машины имеют различные символьные наборы (скажем, EBCDIC и ASCII), то по мере возможности компилятор будет преобразовывать символы исходного текста к символам времени исполнения. Это преобразование зависит от реализации, но в основном касается визуального представления символов.

Вне зависимости от используемого компилятора исходный набор символов и набор времени исполнения содержат (по крайней мере) следующие символы:

a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
! " # % & ' ( ) * + , - . /
: ; < = > ? [ \ ] ^ _ { | } ~

а также пробел, горизонтальную табуляцию, вертикальную табуляцию и перевод страницы. Символ новая строка также будет присутствовать в обоих наборах символов.

Любой символ, не упомянутый выше, может присутствовать в исходном файле в символьной константе, стринге или комментарии, в противном случае поведение не определено.

Если символьный набор компьютера, используемого для компиляции, не содержит определённого символа, то для его представления можно использовать триграфы. См. раздел Символьные константы.

Компиляторы Watcom C/16 и Watcom C/32 используют полный набор символов IBM PC — и для исходного текста, и для исполнения. Множество шестнадцатиричных значений от 00 до 7F составляют набор символов ASCII.

Многобайтовые символы

Многобайтовый символ, как следует из его названия, — символ, для представления которого используется более, чем один байт. Многобайтовые символы позволяют компиляторам обрабатывать расширенные символьные наборы для языков, содержащих больше символов, чем можно представить однобайтовым символьным набором.

Применение многобайтовых символов в общем случае ограничено:

Спецификация многобайтовых символов различна в зависимости от расширенного символьного набора.

Ключевые слова

Следующие слова зарезервированы как часть языка C и называются ключевыми словами. Они не могут использоваться в качестве какого-либо идентификатора, включая имена объектов, имена функций, метки, теги структур или объединений.

auto       double     int        struct
break      else       long       switch
case       enum       register   typedef
char       extern     return     union
const      float      short      unsigned
continue   for        signed     void
default    goto       sizeof     volatile
do         if         static     while

Кроме того, компиляторы Watcom C/16 и C/32 резервируют следующие ключевые слова:

__based    __fortran   __near     __segment
__cdecl    __huge      _Packed    __segname
__export   __interrupt            __pascal
__self
__far      __loadds    __saveregs __syscall

Кроме того, компилятор Watcom C/32 резервирует следующие ключевые слова:

__far16    _Seg16      __stdcall

Заметьте, что, так как C чувствителен к регистру букв, перевод одной или более букв в ключевом слове в верхний регистр приведёт к тому, что компилятор не распознает это слово как ключевое и его можно будет использовать как идентификатор. Однако это не является рекомендуемой программистской практикой.

Идентификаторы

Идентификаторы используются в качестве:

Идентификатор состоит из последовательности следующих символов:

Первый символ не может быть цифрой.

Идентификатор не может быть членом списка ключевых слов.

Идентификаторы могут состоять из любого количества символов, но гарантируется, что компилятор будет считать значащими только первые 31 символ у идентификаторов, которые не имеют внешней связи (разделения между модулями программы). У идентификаторов с внешней связью гарантируются не более 6 значащих символов. Они могут быть чувствительны к регистру.

Конечно, конкретный компилятор может считать значащими большее количество символов, но переносимая программа будет строго придерживаться указанного выше правила. (Это ограничение, скорее всего, будет ослаблено в будущих версиях стандарта ANSI и соответствующих компиляторов.)

Компиляторы Watcom C/16 и C/32 не ограничивают число значащих символов для функций или объектов ни с внешней, ни с внутренней связью.

Линкер поставляемый с Watcom C/16 и C/32, ограничивает количество значащих символов в идентификаторах с внешней связью до 40 и по умолчанию не считает разными идентификаторы, которые отличаются только регистром букв. Можно использовать опцию для того, чтобы заставить линкер различать регистр.

Любой внешний идентификатор, который начинается со знака подчёркивания, может быть зарезервирован компилятором. Любой другой идентификатор, начинающийся двумя знаками подчёркивания или знака подчёркивания и буквы в верхнем регистре может быть зарезервирован. Как правило, программа должна воздерживаться от создания идентификаторов, начинающихся со знака подчёркивания.

Комментарии

Комментарий начинается символами /*, содержит любые символы и заканчивается символами */. Комментарии распознаются в любом месте программы, кроме символьных констант или стрингов. Однажды найденные символы /* будут восприниматься только после того, как встретятся */. Это исключает вложенные комментарии.

Комментарий трактуется как «пробельная литера», что означает подобно пробелу.

Например, следующий фрагмент

/* Закрыть все файлы.
 */
for( i = 0; i < fcount; i++ ) { /* пройти весь список */
    fclose( flist[i] );         /* закрыть файл */
}

эквивалентен

for( i = 0; i < fcount; i++ ) {
    fclose( flist[i] );
}

Комментарии иногда используются для временного исключения части кода во время тестирования или отладки программы. Например, второй фрагмент программы может быть закомментирован:

/*
    for( i = 0; i < fcount; i++ ) {
        fclose( flist[i] );
    }
*/

Это не сработает на первом фрагменте, так как он содержит комментарии, а они не могут быть вложенными. Для этого можно использовать директиву препроцессора #if. Подробнее см. Препроцессор

Компиляторы Watcom C/16 и C/32 поддерживают расширение для комментариев. Символ // может быть использован в любом месте исходной строки (за исключением символьной константы или стрингового литерала). Любые символы от // до конца строки трактуются как комментарий до конца строки. Символа заканчивающего комментарий нет. Например, фрагмент программы в начале этого раздела может быть переписан так.

// Закрыть все файлы.

for( i = 0; i < fcount; i++ ) { // пройти весь список
    fclose( flist[i] );         // закрыть файл
}

В этом случае можно закомментировать код без трудностей, связанных с /*.