Что такое `#pragma pack` для сетевого программирования? - PullRequest
1 голос
/ 15 июня 2011
 #pragma pack(push)
 #pragma pack(1)

Я скачал учебник, и он содержит эти строки в заголовочном файле. Я буду признателен, если вы, ребята, можете предоставить мне какие-либо учебники или ссылки, связанные с этим.

Ответы [ 3 ]

3 голосов
/ 15 июня 2011

Объяснение Microsoft:

http://msdn.microsoft.com/en-us/library/aa273913(v=vs.60).aspx

Объяснение IBM AIX xlC:

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Fcompiler%2Fref%2Frnpgpack.htm

По сути, он определяет границы байтов, которые будут использоваться при хранении структуры или объединения. Push / Pop действует как способ сохранения и извлечения этих настроек в стеке.

Для дальнейшего использования вы можете сэкономить время, выполнив поиск по ключевым словам, о которых вы говорите, в Интернете. Все, что я сделал, чтобы найти эту информацию, - это поиск "пакета pragma" в http://www.google.com

2 голосов
/ 15 июня 2011

Все #pragma операторы зависят от поставщика.

Это специфично для Microsoft и описывает, сколько "упаковки" (в байтах) компилятор может добавить к struct s для лучшего выравнивания.

#pragma pack(push) просто сохраняет и предыдущие настройки в стеке. Затем вы можете изменить условия упаковки для определенного блока кода, а затем #pragma pack(pop), чтобы восстановить предыдущие настройки.

1 голос
/ 15 июня 2011

Это спецификатор упаковки MSVC ++. Вы можете узнать точно, что он делает из документации .

Упаковка изменяет степень заполнения компилятором между элементами данных заданной структуры (или класса) для обеспечения выравнивания. В случае сетевого кода, вероятно, используется спецификатор #pragma pack, так что структура может быть преобразована в char* или void* для передачи в некоторый сетевой API для одновременной отправки всей структуры по сети. .

(Обратите внимание, что это небезопасно, поскольку на разных машинах существуют разные правила выравнивания и порядка байтов; это будет работать только в том случае, если обе машины на каждом конце провода используют один и тот же тип оборудования)

...