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

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

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

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

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

Как я понимаю, препроцессор #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
Посмотрите здесь:

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
5248 / 4568 / 1534
Регистрация: 14.04.2014
Сообщений: 18,163
18.10.2016, 17:41     Препроцессор #pragma #2
Ну хотят выравнивать с параметром 4.
Evg
Эксперт CАвтор FAQ
17533 / 5771 / 369
Регистрация: 30.03.2009
Сообщений: 15,872
Записей в блоге: 26
18.10.2016, 19:47     Препроцессор #pragma #3
Использование #pragma pack(push,1)... pack(pop)

Не по теме:

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

Инженер_3
2 / 2 / 0
Регистрация: 10.06.2016
Сообщений: 86
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
5248 / 4568 / 1534
Регистрация: 14.04.2014
Сообщений: 18,163
18.10.2016, 22:18     Препроцессор #pragma #5
Ну посмотри синтаксис. push/pop - это сохранение и восстановление предыдущего значения, т. е. новое действует только в этих границах. А второй вариант устанавливает до следующего изменения.
Evg
Эксперт CАвтор FAQ
17533 / 5771 / 369
Регистрация: 30.03.2009
Сообщений: 15,872
Записей в блоге: 26
19.10.2016, 10:04     Препроцессор #pragma #6
Цитата Сообщение от Инженер_3 Посмотреть сообщение
Без загрывающей Прагмы.
Это разновидность записи или ошибка?
Думается, закрывающая прагма неявно присутствует по достижению конца файла. Т.е. #pragma push это как бы "включить режим", а #pragma pop как бы "выключить режим". Но понятия push/pop подразумевают вложенность, а потому это немного сложнее, чем просто включить и выключить

Добавлено через 50 секунд
"Включить" и "выключить" относятся к процессу трансляции файла компилятором, а не к процессу исполнения
Инженер_3
2 / 2 / 0
Регистрация: 10.06.2016
Сообщений: 86
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
overmind
327 / 107 / 29
Регистрация: 21.07.2016
Сообщений: 535
19.10.2016, 15:05     Препроцессор #pragma #8
Цитата Сообщение от Инженер_3 Посмотреть сообщение
препроцессор #pragma используется, в частности, для выравнивания полей в структурах
а еще есть
#pragma once
#pragma warning (disable : 4018 )
e.t.c.
Evg
Эксперт CАвтор FAQ
17533 / 5771 / 369
Регистрация: 30.03.2009
Сообщений: 15,872
Записей в блоге: 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
Еще ссылки по теме:

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

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

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

Почему не рекомендуется использовать препроцессор? - C++
Я сейчас активно пользуюсь #define для упрощения понимания кода. Например, у меня сложная система классов, что бы получить одну...

Препроцессор неправильно интерпретирует команды #if #else - C++
#define __LINUX_OS__ #if defined__LINUX_OS__ #include <unistd.h> #elif defined __WINDOWS_OS__ #include <windows.h> #else ...


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

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

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