Далее обсуждаются:
Исходный набор символов содержит символы используемые во время трансляции исходного текста на 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 чувствителен к регистру букв, перевод одной или более букв в ключевом слове в верхний регистр приведёт к тому, что компилятор не распознает это слово как ключевое и его можно будет использовать как идентификатор. Однако это не является рекомендуемой программистской практикой.
Идентификаторы используются в качестве:
typedef
-имени.Идентификатор состоит из последовательности следующих символов:
Первый символ не может быть цифрой.
Идентификатор не может быть членом списка ключевых слов.
Идентификаторы могут состоять из любого количества символов, но гарантируется, что компилятор будет считать значащими только первые 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] ); // закрыть файл }
В этом случае можно закомментировать код без трудностей, связанных
с /*
.