Сделай Сам Свою Работу на 5

R.16.5 Условная трансляция





 

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

условное:

часть-if части-elif opt часть-else opt строка-endif

часть-if:

строка-if текст

строка-if:

# if выражение-константа

# ifdef идентификатор

# ifndef идентификатор

части-elif:

строка-elif текст

части-elif строка-elif текст

строка-elif:

# elif выражение-константа

часть-else:

строка-else текст

строка-else:

# else

строка-endif:

# endif

Константные выражения в #if и #elif (если эти части есть) вычисляются в порядке их задания в тексте до тех пор, пока одно из них не окажется отличным от нуля. Операторы С++, следующие за строкой, в которой выражение оказалось равным нулю, не транслируются. Команды препроцессора, идущие за этой строкой игнорируются. После того, как найдена команда с ненулевым значением выражения, текст всех последующих частей #elif и #else (т.е. операторы C++ и команды препроцессора) игнорируется. Текст, относящийся к первой команде с ненулевым значением выражения подлежит обычной препроцессорной обработке и трансляции. Если значения всех выражений, указанных в #if и #elif, оказались равными нулю, тогда обычной обработке подлежит текст, относящийся к #else.



В выражении-константе, которое встретилось в #if или #elif можно использовать унарную операцию defined, причем в двух вариантах:

defined идентификатор

или

defined (идентификатор)

Если эта операция применяется к идентификатору, который был определен с помощью команды #define, и если это определение не было отменено командой #undef, то результат равен 1, иначе результат равен 0. Сам идентификатор defined нельзя переопределить, нельзя и отменить его определение.

После применения операций defined происходит раскрытие всех всех макроопределений, имеющихся в константном выражении см. §R.16.3. В результате должно получиться целочисленное выражение-константа, отличающееся от определения в §R.5.19 тем, что типы int и unsigned int рассматриваются как long и unsigned long соответственно, а кроме того в этом выражении не должно быть операций приведения, sizeof или элемента перечисления.

Управляющая строка

#ifdef идентификатор

эквивалентна строке

#if defined идентификатор

а управляющая строка



#ifndef идентификатор

эквивалентна строке

#if !defined идентификатор

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

 

R.16.6 Управление строками

 

Для удобства написания программ, порождающих текст на С++, введена управляющая строка вида:

#line константа "имяфайла" opt

Она задает значение предопределенному макроимени __LINE__ (§R.16.10), которое используется в диагностических сообщениях или при символической отладке; а именно: номер следующей строки входного текста считается равным заданной константе, которая должна быть десятичным целым числом. Если задано "имяфайла", то значение макроимени __FILE__ (§R.16.10) становится равным имени указанного файла. Если оно не задано, __FILE__ не меняет своего значения.

Макроопределения в этой управляющей строке раскрываются до выполнения самой команды.

 

R.16.7 Команда error

 

Строка вида:

#error строка-лексем

заставляет реализацию выдать диагностическое сообщение, состоящее из заданной последовательности лексем препроцессора.

 

R.16.8 Команда pragma

 

Строка вида:

#pragma строка-лексем

заставляет реализацию вести себя некоторым определенным образом при условии что реализация "понимает" эту строку. Любая нераспознанная строка #pragma игнорируется.

 

R.16.9 Пустая директива

 

Команда препроцессора вида

#

не оказывает никакого действия.

 

R.16.10 Предопределенные макроимена

 

В процессе трансляции определенную информацию содержат следующие предопределенные макроимена.



 

__LINE__ десятичная константа, содержащая номер текущей строки текста программы на С++
__FILE__ строка литералов, представляющая имя транслируемого входного файла
__DATE__ строка литералов, представляющая дату трансляции в виде "Mmm dd yyyy" или "Mmm d yyyy", если число меньше 10, (здесь Mmm задает месяц, dd - день, а yyyy - год)
__TIME__ строка литералов, представляющая время трансляции в виде "hh:mm:ss", (здесь hh задает часы, mm - минуты, а ss - секунды)

Кроме того, считается определенным при трансляции программы на C++ макроимя __cplusplus.

Перечисленные макроимена нельзя как переопределять, так и отменять их определения.

Макроимена __LINE__ и __FILE__ можно определить с помощью команды #line (§R.16.6).

Определено ли макроимя __STDC, и если да, то каково его значение, зависит от реализации.

 

 

R.17 Приложение A: Сводка грамматики

 

Это приложение не относится к справочному руководству языка и не является определением конструкций C++.

Оно только должно служить более полному пониманию С++. Нельзя рассматривать его как точное определение языка, так как описанная здесь грамматика допускает произвольное множество конструкций, каждая из которых законна для С++. Чтобы различать выражения и описания, следует применять правила разрешения неопределенности (§R.6.8, §R.7.1, §R.10.1.1). Далее, для отсеивания синтаксически правильных, но бессмысленных, конструкций следует применять правила контроля доступа, разрешения неопределенности и контроля типа.

 

R.17.1 Служебные слова

 

В описаниях: typedef (§R.7.1.3), класса (§R.9), перечисления (§R.7.2), шаблона типа - (§R.14) введены новые, зависящие от контекста, служебные слова, а именно:

имя-класса:

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

имя-перечисления:

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

имя-typedef:

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

Отметим, что имя-typedef, обозначающее класс, является в то же время конструкцией имя-класса (§R.9.1).

 

R.17.2 Выражения

 

выражение:

выражение-присваивания

выражение , выражение-присваивания

выражение-присваивания:

выражение-условия

унарное-выражение операция-присваивания выражение-присваивания

операция-присваивания: один из

= *= /= %= += -= ››= ‹‹= &= ^= |=

выражение-условия:

логическое-выражение-ИЛИ

логическое-выражение-ИЛИ ? выражение : выражение-условия

логическое-выражение-ИЛИ:

логическое-выражение-И

логическое-выражение-ИЛИ || логическое-выражение-И

логическое-выражение-И:

выражение-ИЛИ

логическое-выражение-И && выражение-ИЛИ

выражение-ИЛИ:

выражение-исключающего-ИЛИ

выражение-ИЛИ | выражение-исключающего-ИЛИ

выражение-исключающего-ИЛИ:

выражение-И

выражение-исключающего-ИЛИ ^ выражение-И

выражение-И:

выражение-равенства

выражение-И & выражение-равенства

выражение-равенства:

выражение-отношения

выражение-равенства == выражение-отношения

выражение-равенства != выражение-отношения

выражение-отношения:

сдвиговое-выражение

выражение-отношения ‹ сдвиговое-выражение

выражение-отношения › сдвиговое-выражение

выражение-отношения ‹= сдвиговое-выражение

выражение-отношения ›= сдвиговое-выражение

сдвиговое-выражение:

аддитивное-выражение

сдвиговое-выражение ‹‹ аддитивное выражение

сдвиговое-выражение ›› аддитивное выражение

аддитивное-выражение:

мультипликативное-выражение

аддитивное выражение + мультипликативное-выражение

аддитивное-выражение - мультипликативное-выражение

мультипликативное-выражение:

выражение-pm

мультипликативное-выражение * выражение-pm

мультипликативное-выражение / выражение-pm

мультипликативное-выражение % выражение-pm

выражение-pm:

выражение-приведения

выражение-pm .* выражение-приведения

выражение-pm -›* выражение-приведения

выражение-приведения:

унарное-выражение

( имя-типа ) выражение-приведения

унарное-выражение:

постфиксное-выражение

++ унарное выражение

-- унарное выражение

унарная-операция выражение-приведения

sizeof унарная-операция

sizeof ( имя-типа )

выражение-размещения

выражение-освобождения

унарная-операция: один из

* & + - ! ~

выражение-размещения:

:: opt new параметры-new opt имя-типа-new инициализатор-new

:: opt new параметры-new opt ( имя-типа ) инициализатор-new

параметры-new:

( список-выражений )

имя-типа-new:

список-спецификаций-типа описатель-new opt

описатель-new:

* список-спецификаций-cv opt описатель-new opt

имя-класса :: список-спецификаций-cv opt описатель-new opt

описатель-new opt [ выражение ]

инициализатор-new:

( список-инициализаторов opt )

выражение-освобождения:

:: opt delete выражение-приведения

:: opt delete [ ] выражение-приведения

постфиксное-выражение:

первичное-выражение

постфиксное-выражение [ выражение ]

постфиксное-выражение ( список-выражений opt )

имя-простого-типа ( список-выражений opt )

постфиксное-выражение . имя

постфиксное-выражение -› имя

постфиксное-выражение ++

постфиксное-выражение --

список-выражений:

выражение-присваивания

список-выражений , выражение-присваивания

первичное-выражение:

литерал

this

:: идентификатор

:: имя-функции-операции

:: уточненное-имя

( выражение )

имя

имя:

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

имя-функции-операции

имя-функции-преобразования

~имя-класса

уточненное-имя

уточненное-имя:

уточняющее-имя-класса :: имя

литерал:

целая константа

символьная константа

константа с плавающей точкой

строка литералов

 

R.17.3 Описания

 

описания:

спецификации-описания opt список-описателей opt;

описание-asm

определение-функции

спецификация-связи

спецификация-описания:

спецификация-класса-памяти

спецификация-типа

спецификация-fct

спецификация-шаблона-типа

friend

typedef

спецификации-описания:

спецификации-описания opt спецификация-описания

спецификация-класса-памяти:

auto

register

static

extern

спецификация-fct:

inline

virtual

спецификация-типа:

имя-простого-типа

спецификация-класса

спецификация-перечисления

спецификация-сложного-типа

:: имя-класса

const

volatile

имя-простого-типа:

полное-имя-класса

уточненное-имя-типа

char

short

int

long

signed

unsigned

float

double

void

спецификация-сложного-типа:

служебное-слово-класса имя-класса

служебное-слово-класса идентификатор

служебное-слово-класса:

class

struct

union

уточненное-имя-типа:

имя-typedef

имя-класса :: уточненное-имя-типа

полное-имя-класса:

уточненное-имя-класса

:: уточненное-имя-класса

уточненное-имя-класса:

имя-класса

имя-класса :: уточненное-имя-класса

имя-перечисления:

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

спецификация-перечисления:

enum идентификатор opt { список-перечисления }

список-перечисления:

элемент-перечисления

список-перечисления , элемент-перечисления

элемент-перечисления:

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

идентификатор = выражение-константа

спецификация-связи:

extern строка-литерал { список-описаний opt }

extern строка-литерал описание

список-описаний:

описание

список-описаний описание

описание-asm:

asm ( строка-литерал ) ;

 

R.17.4 Описатели

 

список-описаний:

описатель-с-инициализатором

список-описаний , описатель-с-инициализатором

описатель-с-инициализатором:

описатель инициализатор opt

описатель:

имя-в-описателе

операция-ptr описатель

описатель ( список-описаний-параметров ) список-спецификаций-cv opt

описатель [ выражение-константа opt ]

( описатель )

операция-ptr:

* список-спецификаций-cv opt

& список-спецификаций-cv opt

полное-имя-класса :: * список-спецификаций-cv opt

список-спецификаций-cv:

const

volatile

имя-в-описателе:

имя

имя-класса

~имя-класса

имя-typedef

уточненное-имя-типа

имя-типа:

список-спецификаций-типа абстрактный-описатель opt

список-спецификаций-типа:

спецификация-типа список-спецификаций-типа

абстрактный-описатель:

операция-ptr абстрактный-описатель opt

абстрактный-описатель opt ( список-описаний-параметров ) список-спецификаций_cv opt

абстрактный-описатель opt [ выражение-константа opt ]

( абстрактный-описатель )

список-описаний-параметров:

список-описаний-парам optopt

список-описаний-парам , …

список-описаний-парам:

описание-параметра

список-описаний-парам , описание-параметра

описание-параметра:

спецификации-описания описатель

спецификации-описания описатель = выражение

спецификации-описания абстрактный-описатель opt

спецификации-описания абстрактный-описатель opt = выражение

определение-функции:

спецификации-описания opt описатель инициализатор-ctor тело-функции

тело-функции:

составной-оператор

инициализатор:

= выражение-присваивания

= { список-инициализаторов , opt }

( список-выражений )

список-инициализаторов:

выражение-присваивания

список-инициализаторов , выражение-присваивания

{ список-инициализаторов , opt }

 

R.17.5 Описания класса

 

спецификация-класса:

заголовок-класса { список-членов opt }

заголовок-класса:

служебное-слово-класса идентификатор opt спец-базовых opt

служебное-слово-класса имя-класса спец-базовых opt

служебное-слово-класса:

class

struct

union

список-членов:

описание-члена список-членов opt

спецификация-доступа : список-членов opt

описание-члена:

спецификации-описания opt список-описателей-членов opt ;

определение-функции ; opt

уточненное-имя ;

список-описателей-членов:

описатель-члена

список-описателей-членов , описатель-члена

описатель-члена:

описатель спецификация-чистой opt

идентификатор opt : выражение-константа

спецификация-чистой:

= 0

список-базовых:

спецификация-базовых

список-базовых , спецификация-базовых

спецификация-базовых:

полное-имя-класса

virtual спецификация-доступа opt полное-имя-класса

спецификация-доступа virtual opt полное-имя-класса

спецификация-доступа:

private

protected

public

имя-функции-преобразования:

operator имя-типа-преобразования

имя-типа-преобразования:

список-спецификаций-типа операция-ptr opt

инициализатор-ctor:

: список-инициализаторов-членов

список-инициализаторов-членов:

инициализатор-члена

инициализатор-члена , список-инициализаторов-члена

инициализатор-члена:

полное-имя-класса ( список-выражений opt )

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

имя-функции-оператор:

operator операция

операция : один из

new delete

+ - * / % ^& | ~

! = ‹ › += -= *= /= %=

^= &= |= ‹‹ ›› ››= ‹‹= == !=

‹= ›= && || ++ -- , -›* -›

() []

 

R.17.6 Операторы

 

оператор:

помеченный-оператор

оператор-выражение

составной-оператор

выбирающий-оператор

оператор-цикла

оператор-перехода

оператор-описания

помеченный-оператор:

идентификатор : оператор

case выражение-константа : оператор

default : оператор

оператор-выражение:

выражение opt;

составной-оператор:

{ список-операторов opt }

список-операторов:

оператор

список-операторов оператор

выбирающий-оператор:

if ( выражение ) оператор

if ( выражение ) оператор else оператор

switch ( выражение ) оператор

оператор-цикла:

while ( выражение ) оператор

do оператор while ( выражение )

for ( оператор-иниц выражение opt ; выражение opt ) оператор

оператор-иниц:

оператор-выражение

оператор-описание

оператор-перехода:

break ;

continue ;

return выражение opt ;

goto идентификатор ;

оператор-описания:

описание

 

R.17.7 Препроцессор

 

#define идентификатор строка-лексем

#define идентификатор ( идентификатор , … , идентификатор ) строка-лексем

#include "имяфайла"

#include ‹имяфайла›

#line константа "имяфайла" opt

#undef идентификатор

условное:

часть-if части-elif opt часть-else opt строка-endif

часть-if:

строка-if текст

строка-if:

# if выражение-константа

# ifdef идентификатор

# ifndef идентификатор

части-elif:

строка-elif текст

части-elif строка-elif текст

строка-elif:

# elif выражение-константа

часть-else:

строка-else текст

строка-else:

# else

строка-endif:

# endif

 

R.17.8 Шаблоны типа

 

описание-шаблона-типа:

template ‹ список-параметров-шаблона-типа › описание

список-параметров-шаблона-типа:

параметр-шаблона-типа

список-параметров-шаблона-типа , параметр-шаблона-типа

параметр-шаблона-типа:

параметр-типа

описание-параметра

параметр-типа:

class идентификатор

имя-шаблонного-класса:

имя-шаблона-типа ‹ список-парам-шаблона-типа ›

список-парам-шаблона-типа:

парам-шаблона-типа

список-парам-шаблона-типа , парам-шаблона-типа

парам-шаблона:

выражение

имя-типа

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.