Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Инженер_3
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 105
#1

Препроцессор #pragma - C++

18.10.2016, 10:55. Просмотров 300. Ответов 9
Метки нет (Все метки)

Как я понимаю, препроцессор #pragma используется, в частности, для выравнивания полей в структурах.
Например, в заголовочном файле перед объявлением структур пишут:
C++
1
#pragma pack(push, 2) //как я понимаю push - это начало, а 2 - шаг выравнивания
После окончания объявления структур пишут:
C++
1
#pragma pack(pop)   //наверное это говорит о окончании выравнивания полей структур по указанным выше параметрам
Но зачем пишут в cpp-файлах #pragma pack(4) ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2016, 10:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Препроцессор #pragma (C++):

препроцессор, #if - C++
Создаю файл: #define PARAM ABC #if PARAM == ABC #warning warning passed #endif #if PARAM == XXX #error error reached #endif

Препроцессор - C++
Профессионалы, ответте вот на какой вопрос: Мне необходимо получить файл, который образуется после обработки препроцессором, т.е....

препроцессор с++ - C++
Задача: Сделать так, что бы при определённом условии класс "знал" что его тестируют в консоли, и выводил в неё всю необходимую...

Препроцессор vs текст - C++
Привет. Я баловался с директивами препроцессора и как-то задумал с помощью директивы #include вставить текст в char *. У меня вышло, я...

Препроцессор С++Builder - C++
Напишите программу, которая выводит на экран квадрат Пифагора — таблицу умножения.

Препроцессор,исключительные ситуации - C++
Всем доброго времени суток!) По прочтению изложенного в моей книге материала по искл. ситуациям и операторам препроцессора(? так можно...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
nmcf
5319 / 4639 / 1551
Регистрация: 14.04.2014
Сообщений: 18,452
18.10.2016, 17:41 #2
Ну хотят выравнивать с параметром 4.
0
Evg
Эксперт CАвтор FAQ
17808 / 6014 / 388
Регистрация: 30.03.2009
Сообщений: 16,525
Записей в блоге: 26
18.10.2016, 19:47 #3
Использование #pragma pack(push,1)... pack(pop)

Не по теме:

Не "препроцессор #pragma", а "директива #pragma"

0
Инженер_3
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 105
18.10.2016, 22:14  [ТС] #4
Цитата Сообщение от Evg Посмотреть сообщение
Использование #pragma pack(push,1)... pack(pop)
То есть формат использования дерективы #pragma:
C++
1
2
3
4
5
6
#pragma pack(push, 1)
typedef struct
{
  ...
} XXX;
#pragma pack(pop)
А что за такой формат:
C++
1
2
3
4
5
6
7
8
9
#pragma pack(4)
typedef struct
{
  ...
} YYY;
typedef struct
{
  ...
} ZZZ;
Без загрывающей Прагмы.
Это разновидность записи или ошибка?
0
nmcf
5319 / 4639 / 1551
Регистрация: 14.04.2014
Сообщений: 18,452
18.10.2016, 22:18 #5
Ну посмотри синтаксис. push/pop - это сохранение и восстановление предыдущего значения, т. е. новое действует только в этих границах. А второй вариант устанавливает до следующего изменения.
0
Evg
Эксперт CАвтор FAQ
17808 / 6014 / 388
Регистрация: 30.03.2009
Сообщений: 16,525
Записей в блоге: 26
19.10.2016, 10:04 #6
Цитата Сообщение от Инженер_3 Посмотреть сообщение
Без загрывающей Прагмы.
Это разновидность записи или ошибка?
Думается, закрывающая прагма неявно присутствует по достижению конца файла. Т.е. #pragma push это как бы "включить режим", а #pragma pop как бы "выключить режим". Но понятия push/pop подразумевают вложенность, а потому это немного сложнее, чем просто включить и выключить

Добавлено через 50 секунд
"Включить" и "выключить" относятся к процессу трансляции файла компилятором, а не к процессу исполнения
0
Инженер_3
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 105
19.10.2016, 12:52  [ТС] #7
Цитата Сообщение от nmcf Посмотреть сообщение
А второй вариант устанавливает до следующего изменения.
Но следующее изменение такое же.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma pack(4)
typedef struct
{
  ...
} YYY;
typedef struct
{
  ...
} ZZZ;
 
#pragma pack(4)
typedef struct
{
  ...
} WWW;
typedef struct
{
  ...
} RRR;
Добавлено через 1 минуту
Или это ошибка - лишний раз написано одно и то же?
0
dailydose
overmind
336 / 116 / 30
Регистрация: 21.07.2016
Сообщений: 571
19.10.2016, 15:05 #8
Цитата Сообщение от Инженер_3 Посмотреть сообщение
препроцессор #pragma используется, в частности, для выравнивания полей в структурах
а еще есть
#pragma once
#pragma warning (disable : 4018 )
e.t.c.
0
Evg
Эксперт CАвтор FAQ
17808 / 6014 / 388
Регистрация: 30.03.2009
Сообщений: 16,525
Записей в блоге: 26
19.10.2016, 16:39 #9
Цитата Сообщение от Инженер_3 Посмотреть сообщение
Или это ошибка - лишний раз написано одно и то же?
Что ошибочного в том, что попросили два раза "включить" значение 4?
0
Инженер_3
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 105
19.10.2016, 19:32  [ТС] #10
Цитата Сообщение от Evg Посмотреть сообщение
Что ошибочного в том, что попросили два раза "включить" значение 4?
Получается лишняя строка кода. Ведь начинается выравнивание со строки #pragma pack(4), за заканчивается концом файла.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2016, 19:32
Привет! Вот еще темы с ответами:

Почему не работает препроцессор? - C++
Почему не работает программа? Вроде все сделал правильно. Задание: Создать проект в котором: 1. создать три файла: ( function.h ,...

#pragma once - C++
Здравствуйте. Есть три файла (для удобства забудем о двух других .cpp): Main.cpp Head1.h Head2.h //Main.cpp #include...

#pragma once - C++
Здравствуйте #pragma once Куда его лучше вставлять ? В файл самого класс(например, сf.h) или в реализацию его функций (cf.cpp)?

#pragma once - C++
Можно ли считать директиву #pragma once полноценно заменой техники #ifndef MYFILE_H #define MYFILE_H ... #end if


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.10.2016, 19:32
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru