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

107
задан MD XF 25 March 2017 в 18:50
поделиться

5 ответов

#pragma для директив компилятора, которые являются определенными для машины или определенными для операционной системы, т.е. это говорит компилятору делать что-то, устанавливать некоторую опцию, принимать некоторые меры, переопределять некоторое значение по умолчанию, и т.д. который может или не может относиться ко всем машинам и операционным системам.

См. msdn для большего количества информации

61
ответ дан MD XF 24 November 2019 в 03:41
поделиться

#pragma используется, чтобы сделать что-то определенное для реализации в C, т.е. быть прагматичными для текущего контекста, а не идеологически быть догматичными.

тот, который я регулярно использую, #pragma pack(1), где я пытаюсь сжать больше из своего пространства памяти на встроенных решениях с массивами структур, которые иначе закончились бы с 8-байтовым выравниванием.

Жалость мы еще не имеем #dogma. Это было бы забавой;)

52
ответ дан MD XF 24 November 2019 в 03:41
поделиться

Я обычно старался бы избегать использования #pragmas, если это возможно, так как они являются чрезвычайно зависимыми от компилятора и непортативными. Если Вы хотите использовать их портативным способом, необходимо будет окружить каждую прагму #if / #endif пара. GCC препятствует использованию прагм, и действительно только поддерживает некоторых из них для совместимости с другими компиляторами; GCC имеет другие способы сделать то же самое, для которого другие компиляторы используют прагмы.

, Например, вот то, как Вы удостоверились бы, что структура упаковывается плотно (т.е. никакое дополнение между участниками) в MSVC:

#pragma pack(push, 1)
struct PackedStructure
{
  char a;
  int b;
  short c;
};
#pragma pack(pop)
// sizeof(PackedStructure) == 7

Вот то, как Вы сделали бы то же самое в GCC:

struct PackedStructure __attribute__((__packed__))
{
  char a;
  int b;
  short c;
};
// sizeof(PackedStructure == 7)

код GCC является более портативным, потому что, если Вы хотите скомпилировать это с non-GCC компилятором, все, которое необходимо сделать,

#define __attribute__(x)

принимая во внимание, что, если Вы хотите портировать код MSVC, необходимо окружить каждую прагму #if / #endif пара. Не симпатичный.

32
ответ дан nick_g 24 November 2019 в 03:41
поделиться

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

#pragma code BANK1
#pragma data BANK2

#pragma INT3 TimerHandler
5
ответ дан Justin Love 24 November 2019 в 03:41
поделиться

Помещение #pragma once наверху Вашего заголовочного файла гарантирует, что только включено однажды. Обратите внимание, что #pragma once не стандартный C99, но поддерживаемый большинством современных компиляторов.

альтернатива должна использовать, включают защиту (например, #ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */)

15
ответ дан user01CU812 24 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: