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

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

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

Препроцессор C++
Препроцессор С++Builder C++
C++ препроцессор с++
препроцессор, #if C++
Препроцессор неправильно интерпретирует команды #if #else C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
18.10.2016, 17:41     Препроцессор #pragma #2
Ну хотят выравнивать с параметром 4.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
18.10.2016, 19:47     Препроцессор #pragma #3
Использование #pragma pack(push,1)... pack(pop)

Не по теме:

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

Инженер_3
1 / 1 / 0
Регистрация: 10.06.2016
Сообщений: 56
18.10.2016, 22:14  [ТС]     Препроцессор #pragma #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;
Без загрывающей Прагмы.
Это разновидность записи или ошибка?
nmcf
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
18.10.2016, 22:18     Препроцессор #pragma #5
Ну посмотри синтаксис. push/pop - это сохранение и восстановление предыдущего значения, т. е. новое действует только в этих границах. А второй вариант устанавливает до следующего изменения.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
19.10.2016, 10:04     Препроцессор #pragma #6
Цитата Сообщение от Инженер_3 Посмотреть сообщение
Без загрывающей Прагмы.
Это разновидность записи или ошибка?
Думается, закрывающая прагма неявно присутствует по достижению конца файла. Т.е. #pragma push это как бы "включить режим", а #pragma pop как бы "выключить режим". Но понятия push/pop подразумевают вложенность, а потому это немного сложнее, чем просто включить и выключить

Добавлено через 50 секунд
"Включить" и "выключить" относятся к процессу трансляции файла компилятором, а не к процессу исполнения
Инженер_3
1 / 1 / 0
Регистрация: 10.06.2016
Сообщений: 56
19.10.2016, 12:52  [ТС]     Препроцессор #pragma #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 минуту
Или это ошибка - лишний раз написано одно и то же?
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
19.10.2016, 15:05     Препроцессор #pragma #8
Цитата Сообщение от Инженер_3 Посмотреть сообщение
препроцессор #pragma используется, в частности, для выравнивания полей в структурах
а еще есть
#pragma once
#pragma warning (disable : 4018 )
e.t.c.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
19.10.2016, 16:39     Препроцессор #pragma #9
Цитата Сообщение от Инженер_3 Посмотреть сообщение
Или это ошибка - лишний раз написано одно и то же?
Что ошибочного в том, что попросили два раза "включить" значение 4?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2016, 19:32     Препроцессор #pragma
Еще ссылки по теме:

Препроцессор,исключительные ситуации C++
C++ Почему не рекомендуется использовать препроцессор?
C++ Препроцессор vs текст

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

Или воспользуйтесь поиском по форуму:
Инженер_3
1 / 1 / 0
Регистрация: 10.06.2016
Сообщений: 56
19.10.2016, 19:32  [ТС]     Препроцессор #pragma #10
Цитата Сообщение от Evg Посмотреть сообщение
Что ошибочного в том, что попросили два раза "включить" значение 4?
Получается лишняя строка кода. Ведь начинается выравнивание со строки #pragma pack(4), за заканчивается концом файла.
Yandex
Объявления
19.10.2016, 19:32     Препроцессор #pragma
Ответ Создать тему
Опции темы

Текущее время: 07:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru