Разделы презентаций


Классы памяти. Препроцессор

Содержание

ПланЛекция 10ПланКлассы памяти переменныхПрепроцессор

Слайды и текст этой презентации

Слайд 1Классы памяти. Препроцессор
Алтайский государственный университет Математический факультет Кафедра информатики
Барнаул 2009

Классы памяти. ПрепроцессорАлтайский государственный университет Математический факультет Кафедра информатикиБарнаул 2009

Слайд 2План
Лекция 10
План
Классы памяти переменных
Препроцессор

ПланЛекция 10ПланКлассы памяти переменныхПрепроцессор

Слайд 3Классы памяти переменных
Автоматический класс
Статический класс
Регистровый класс
Внешний класс
Внешний статический класс
Изменяемость переменных
Общая

схема описания переменных

Классы памяти переменныхАвтоматический классСтатический классРегистровый классВнешний классВнешний статический классИзменяемость переменныхОбщая схема описания переменных

Слайд 4Классы памяти переменных
Классы памяти переменных
Класс памяти переменной определяет область видимости

и время жизни переменной

В языке Си переменные могут иметь один

из следующих классов памяти:
auto – автоматический
static – статический
extern – внешний
register – регистровый
внешний статический
Классы памяти переменныхКлассы памяти переменныхКласс памяти переменной определяет область видимости и время жизни переменнойВ языке Си переменные

Слайд 5Классы памяти переменных
Классы памяти переменных
Автоматический класс памяти (auto)
задается необязательным ключевым

словом auto при описании переменной перед указанием типа
auto float f=0;
время

существования переменной определяется областью видимости
переменная создается в начале блока {…}
переменная удаляется в конце блока {…}
при инициализации переменных допускается употребление выражений, включающих переменные и вызовы функций
auto float a=10, b=2*a*sqrt(a);


Классы памяти переменныхКлассы памяти переменныхАвтоматический класс памяти (auto)задается необязательным ключевым словом auto при описании переменной перед указанием

Слайд 6Классы памяти переменных
Классы памяти переменных
Автоматический класс памяти (auto)
задается необязательным ключевым

словом auto при описании переменной перед указанием типа
область действия существования

переменной определяется областью видимости

void main() {
auto int i;
for (i=0; i<5; ++i) {
int k=100;
if(i%2) {
int d = 3;
   k-=d;
}
k++;
}
}  





Область видимости i

Создание i в памяти

Инициализация i

Использование i

Удаление i

Классы памяти переменныхКлассы памяти переменныхАвтоматический класс памяти (auto)задается необязательным ключевым словом auto при описании переменной перед указанием

Слайд 7Классы памяти переменных
Классы памяти переменных
void main() {
auto int

i;
for (i=0; i

if(i%2) {
int d = 3;
   k-=d;
}
k++;
}
}  

Создание k в памяти

Инициализация k

Использование k

Удаление k





Область видимости k

Автоматический класс памяти (auto)
задается необязательным ключевым словом auto при описании переменной перед указанием типа
время существования переменной определяется областью видимости

Классы памяти переменныхКлассы памяти переменныхvoid main() {  auto int i; for (i=0; i

Слайд 8Классы памяти переменных
Классы памяти переменных
void main() {
auto int

i;
for (i=0; i

if(i%2) {
int d = 3;
   k-=d;
}
k++;
}
}  

Создание d в памяти

Инициализация d

Использование d

Удаление d





Область видимости d

Автоматический класс памяти (auto)
задается необязательным ключевым словом auto при описании переменной перед указанием типа
время существования переменной определяется областью видимости

Классы памяти переменныхКлассы памяти переменныхvoid main() {  auto int i; for (i=0; i

Слайд 9Классы памяти переменных
Классы памяти переменных
Автоматический класс памяти auto
#include

void func(int

p) {
auto int a = 2; /* автоматическая переменная

*/
int b = sqrt(a); /* автоматическая переменная */
b += 2*a + p;   
printf(“a = %d, b = %d\n“, a, b);
}

void main() {
int i;   /* автоматическая переменная */
for (i=0; i<5; ++i)
if(i%2) {
int d = 13; /* автоматическая переменная */
func(i+d);   
}
}

Создание a,b в памяти

Инициализация a,b

Использование a,b

Удаление a,b

Классы памяти переменныхКлассы памяти переменныхАвтоматический класс памяти auto#include void func(int p) { auto int a = 2; /*

Слайд 10Классы памяти переменных
Классы памяти переменных
Статический класс памяти (static)
задается ключевым словом

static при описании переменной перед указанием типа
static int a=0;
область видимости

переменной – блок {…}, в котором она определена
время существования переменной – сеанс работы программы
переменная создается при старте программы
переменная удаляется при завершении программы
инициализация переменных осуществляется только при первом входе в блок
static int a=0; /* инициализация однократна, */ /* между входами в блок */ /* значение переменной сохраняется */
параметры функций не могут быть статическими

Классы памяти переменныхКлассы памяти переменныхСтатический класс памяти (static)задается ключевым словом static при описании переменной перед указанием типаstatic

Слайд 11Классы памяти переменных
Классы памяти переменных
Пример. Автоматическая и статическая переменные
#include
void

stat(); /* прототип функции */

void main() {
int i;

 
for (i=0;i<5;++i) stat();   
}  

void stat() {
int a = 0; /* автоматическая переменная */
static int s = 0; /* статическая переменная */ 
printf(“auto = %d, static = %d\n“, a, s);
++a; ++s;   
}

int a = 0;

static int s = 0;

a создается и инициализируется при каждом вызове функции

s создается при старте программы

s удаляется при завершении программы

s инициализируется только при первом вызове функции, сохраняя значение между вызовами

Классы памяти переменныхКлассы памяти переменныхПример. Автоматическая и статическая переменные#include void stat(); /* прототип функции */void main() {

Слайд 12Классы памяти переменных
Функции в Си
Пример. Автоматическая и статическая переменные
auto =

0, static = 0
auto = 0, static = 1
auto =

0, static = 2
auto = 0, static = 3
auto = 0, static = 4
Классы памяти переменныхФункции в СиПример. Автоматическая и статическая переменныеauto = 0, static = 0auto = 0, static

Слайд 13Классы памяти переменных
Классы памяти переменных
Регистровый класс памяти (register)
задается ключевым словом

register при описании переменной перед указанием типа
register int k=0;
при возможности

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

void main() {
register int i; /* регистровая переменная */
for (i=0; i<15; ++i) printf(“%d\n”, i);
}

Классы памяти переменныхКлассы памяти переменныхРегистровый класс памяти (register)задается ключевым словом register при описании переменной перед указанием типаregister

Слайд 14Классы памяти переменных
Классы памяти переменных
Внешний класс памяти (extern)
внешние переменные –

переменные, определенные вне функций
область действия внешних переменных – вся программа,

т.е. внешние переменные глобальны

Определение

Использование

Использование

Использование

Классы памяти переменныхКлассы памяти переменныхВнешний класс памяти (extern)внешние переменные –  переменные, определенные  вне функцийобласть действия

Слайд 15Классы памяти переменных
Классы памяти переменных
Внешний класс памяти (extern)
определение внешней переменной

должно быть единственным на программу (только в одном файле)
int global=100;
при

определении внешней переменной не требуется указывать специальных ключевых слов!
для использования внешних переменных, определенных за пределами данного файла, нужно поместить объявление внешней переменной
extern int global;

Определение

Классы памяти переменныхКлассы памяти переменныхВнешний класс памяти (extern)определение внешней переменной  должно быть единственным на  программу

Слайд 16Классы памяти переменных
Классы памяти переменных
Внешний класс памяти (extern)
определение внешней переменной

– в одном файле
в остальных – объявление переменной
Определение
Объявление
Объявление

Классы памяти переменныхКлассы памяти переменныхВнешний класс памяти (extern)определение внешней переменной – в одном файлев остальных – объявление

Слайд 17Классы памяти переменных
Классы памяти переменных
Внешний класс памяти (extern)

инициализировать внешние переменные

можно только в определении (не в объявлении)
int global=1024;

/* корректно */
extern int global=0; /* некорректно */

инициализировать внешние переменные можно только константными выражениями без вызовов функций
int global=(8*1024)/2; /* корректно */
float wrong=2*sqrt(global); /* некорректно */
Классы памяти переменныхКлассы памяти переменныхВнешний класс памяти (extern)инициализировать внешние переменные можно только  в определении (не в

Слайд 18Классы памяти переменных
Классы памяти переменных
Внешний статический класс памяти
Внешние переменные могут

быть объявлены как статические
Область видимости внешней статической переменной – файл,

в котором она определена (а не вся программа)

Внешняя статическая переменная

Доступна в том же файле ниже определения

Недоступна в других файлах

Классы памяти переменныхКлассы памяти переменныхВнешний статический класс памятиВнешние переменные могут быть объявлены как статическиеОбласть видимости внешней статической

Слайд 19Классы памяти переменных
Квалификаторы const и volatile
Определение любой переменной может предваряться

квалификаторами const или volatile
Квалификатор const запрещает любые изменения значения переменной

после ее инициализации
const double PI = 3.141592;
const int N = 1000;
Квалификатор volatile извещает компилятор о том, что значение переменной может изменяться внешними по отношению к программе процессами
volatile unsigned Time;
учитывается при оптимизации кода программы
Классы памяти переменныхКвалификаторы const и volatileОпределение любой переменной может предваряться квалификаторами const или volatileКвалификатор const запрещает любые

Слайд 20Классы памяти переменных
Описание переменных: общая схема
Квалификаторы и модификаторы
const
volatile
auto
static
register
extern
signed
unsigned
short
long
long long
int
char
float
double
Класс памяти
Изменя- емость
Знаковость
Длина
Тип
Примеры:
static

volatile unsigned long long int TimeTicks;
register const unsigned long double

MyRealVar;
auto signed short int x_coord;
Классы памяти переменныхОписание переменных: общая схемаКвалификаторы и модификаторыconstvolatileautostaticregisterexternsignedunsignedshortlonglong longintcharfloatdoubleКласс памятиИзменя- емостьЗнаковостьДлинаТипПримеры:static volatile unsigned long long int TimeTicks;register

Слайд 21Препроцессор
Препроцессор: что это?
Директивы препроцессора
Подключение файлов
Условная компиляция
Макросы

ПрепроцессорПрепроцессор: что это?Директивы препроцессораПодключение файловУсловная компиляцияМакросы

Слайд 22Препроцессор
Препроцессор: что это?
Препроцессор – специальная программа, автоматически вызываемая компилятором перед

собственно компиляцией
1й проход: вызов препроцессора для Си-файла
2й проход: вызов компилятора для

измененного Си-файла

Препроцессор

Компилятор

ПрепроцессорПрепроцессор: что это?Препроцессор – специальная  программа, автоматически  вызываемая компилятором  перед собственно компиляцией1й проход: вызов

Слайд 23Препроцессор
Директивы препроцессора
Три основных типа директив
Подключение файла
#include
Условной компиляции
#if, #ifdef, #ifndef, #else,

#elif, #endif
Макро-подстановка (макрос)
#define, #undef
Правила построения директив
Всегда начинается с #
Может появляться

в любом месте программы
В той же строке может содержаться комментарий
Воспринимается как одна строка, если явно не продолжена
#define MAX_CHARS 300 /*Макс. длина имени файла*/
#define MAX_FILES \ 100
ПрепроцессорДирективы препроцессораТри основных типа директивПодключение файла#includeУсловной компиляции#if, #ifdef, #ifndef, #else, #elif, #endifМакро-подстановка (макрос)#define, #undefПравила построения директивВсегда начинается

Слайд 24Препроцессор
Подключение файлов
Зачем?
Позволяет разделять программу или модули на интерфейс и реализацию

(см. Принципы структурного программирования)

Интерфейс (заголовочный файл) содержит все объявления модуля

(константы, переменные, типы данных, функции)
Рекомендуемое расширение заголовочного файла: .h

Имена заголовочных файлов пользователя – в “ … ”
#include “mydefs.h”

Имена системных заголовочных файлов – в < … >
#include
ПрепроцессорПодключение файловЗачем?Позволяет разделять программу или модули на интерфейс и реализацию (см. Принципы структурного программирования)Интерфейс (заголовочный файл) содержит

Слайд 25Препроцессор
Условная компиляция
Зачем?
Один и тот же исходный код для различных платформ
Необходимость

иметь различный код для специфических ситуаций
Условная компиляция
#ifdef name
#ifndef name
#if expr
#elif

expr
#else
#endif
Удаление макро- определений
#undef PLUSONE
ПрепроцессорУсловная компиляцияЗачем?Один и тот же исходный код для различных платформНеобходимость иметь различный код для специфических ситуацийУсловная компиляция#ifdef

Слайд 26Препроцессор
Условная компиляция
Другой пример

ПрепроцессорУсловная компиляцияДругой пример

Слайд 27Препроцессор
Макросы
Предоставляют возможность параметризованной автоматической текстовой замены
Зачем?
Порождаемый код иногда может быть

быстрее
Нет контроля типов
Макро-определение
#define MAXLINE 120
#define lower(c) ((c)-`A’+‘a’)
Макро-подстановка
char buf[MAXLINE+1]; превращается в char buf[120+1];
c

= lower(buf[i]); превращается в c = ((buf[i])-`A’+‘a’);

ПрепроцессорМакросыПредоставляют возможность параметризованной автоматической текстовой заменыЗачем?Порождаемый код иногда может быть быстрееНет контроля типовМакро-определение#define MAXLINE 120#define lower(c) ((c)-`A’+‘a’)Макро-подстановкаchar

Слайд 28Препроцессор
Макросы: используйте ( )
Всегда заключайте параметры макро-функций в скобки!!!
#define plusone(x)

x+1

i = 3*plusone(2);

… i = 3*2+1;

#define plusone(x) ((x)+1)

i = 3*plusone(2);

… i =

3*((2)+1);

ПрепроцессорМакросы: используйте ( )Всегда заключайте параметры макро-функций в скобки!!!#define plusone(x) x+1…i = 3*plusone(2);… … i = 3*2+1;…#define

Слайд 29Препроцессор
Макросы: думайте о побочных эффектах
Частой причиной побочных эффектов являются операции

“++“ и “--“
Всегда избегайте дополнительных трюков с параметрами макро-функций
#define max(a,

b) ((a)>(b)?(a):(b))
...
y = max(i++, j++);
...

...
y = ((i++)>(j++)?(i++):(j++));
...

ПрепроцессорМакросы: думайте о побочных эффектахЧастой причиной побочных эффектов являются операции “++“ и “--“Всегда избегайте дополнительных трюков с

Слайд 30Препроцессор
Макросы: оператор #
Оператор # в макросах конвертирует аргумент в строковую

константу
Всегда избегайте дополнительных трюков с параметрами макро-функций
#define PRINT_INT(x) printf( #x

“= %d\n”, x)
...
PRINT_INT( x * y );
...

...
printf( “x * y” “= %d\n”, x*y);
...

ПрепроцессорМакросы: оператор #Оператор # в макросах конвертирует аргумент в строковую константуВсегда избегайте дополнительных трюков с параметрами макро-функций#define

Слайд 31Препроцессор
Макросы: оператор ##
Нужен крайне редко
Склеивает две лексемы
#define GENERIC_MAX(type) \
type type##_max(type

x, type y) \
{ return x > y ? x

: y };
...
GENERIC_MAX(float) ...

...
float float_max(float x, float y)
{ return x > y ? x : y };
...

ПрепроцессорМакросы: оператор ##Нужен крайне редкоСклеивает две лексемы#define GENERIC_MAX(type) \type type##_max(type x, type y) \{ return x >

Слайд 32Препроцессор
Другие директивы: #error
Позволяет препроцессору инициировать ошибки компиляции
#error сообщение

Пример
#if defined(WINDOWS)
...
#elif

defined(LINUX)
...
#elif defined(MAC_OS_X)
...
#else
#error no OS specified
#endif

ПрепроцессорДругие директивы: #error Позволяет препроцессору инициировать ошибки компиляции#error сообщениеПример#if defined(WINDOWS)...#elif defined(LINUX)...#elif defined(MAC_OS_X)...#else#error no OS specified#endif

Слайд 33Препроцессор
Другие директивы: #line
Позволяет переопределить номер строки для компилятора
#line n
или
#line n

“file”
Пример




> gcc one.c
> two.c: In function 'main':
> two.c:101: 'i' undeclared

(first use in this function)
ПрепроцессорДругие директивы: #lineПозволяет переопределить номер строки для компилятора#line nили#line n “file”Пример> gcc one.c> two.c: In function 'main':>

Слайд 34Препроцессор
Макросы: некоторые общие свойства
Макросы могут содержать макросы
Препроцессор может делать несколько

проходов для повторной замены

Макро-определение имеет силу до конца файла

Макрос не

может определяться дважды

Перед повторным определением необходимо аннулировать предыдущее с помощью #undef
ПрепроцессорМакросы: некоторые общие свойстваМакросы могут содержать макросыПрепроцессор может делать несколько проходов для повторной заменыМакро-определение имеет силу до

Слайд 35Препроцессор
Препроцессор: резюме
Препроцессор позволяет программисту автоматически модифицировать исходный код программы перед

компиляцией
Подключение файлов
Условная компиляция
Макросы

Макросы иногда полезны, но требуют повышенного внимания (опасны!)
Убедитесь,

что Вы помните основные правила
Используйте скобки, где только можно
Думайте о побочных эффектах
ПрепроцессорПрепроцессор: резюмеПрепроцессор позволяет программисту автоматически модифицировать исходный код программы перед компиляциейПодключение файловУсловная компиляцияМакросыМакросы иногда полезны, но требуют

Слайд 36Вопросы и ответы
Вопросы?
Классы памяти переменных
Автоматический класс
Статический класс
Регистровый класс
Внешний класс
Внешний статический

класс
Изменяемость переменных
Общая схема описания переменных
Препроцессор
Препроцессор: что это?
Директивы препроцессора
Подключение файлов
Условная компиляция
Макросы
Т.

Зеленченко Иллюстрация к произведению И.Ильфа и Е.Петрова "12 стульев"
Вопросы и ответыВопросы?Классы памяти переменныхАвтоматический классСтатический классРегистровый классВнешний классВнешний статический классИзменяемость переменныхОбщая схема описания переменныхПрепроцессорПрепроцессор: что это?Директивы

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика