#pragma
для директив компилятора, которые являются определенными для машины или определенными для операционной системы, т.е. это говорит компилятору делать что-то, устанавливать некоторую опцию, принимать некоторые меры, переопределять некоторое значение по умолчанию, и т.д. который может или не может относиться ко всем машинам и операционным системам.
См. msdn для большего количества информации
#pragma
используется, чтобы сделать что-то определенное для реализации в C, т.е. быть прагматичными для текущего контекста, а не идеологически быть догматичными.
тот, который я регулярно использую, #pragma pack(1)
, где я пытаюсь сжать больше из своего пространства памяти на встроенных решениях с массивами структур, которые иначе закончились бы с 8-байтовым выравниванием.
Жалость мы еще не имеем #dogma
. Это было бы забавой;)
Я обычно старался бы избегать использования #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
пара. Не симпатичный.
Мой лучший совет состоит в том, чтобы посмотреть на документацию Вашего компилятора, потому что прагмы являются по определению определенными для реализации. Например, во встроенных проектах я использовал их, чтобы определить местоположение кода и данных в различных разделах, или объявить обработчиков прерываний. т.е.:
#pragma code BANK1
#pragma data BANK2
#pragma INT3 TimerHandler
Помещение #pragma once
наверху Вашего заголовочного файла гарантирует, что только включено однажды. Обратите внимание, что #pragma once
не стандартный C99, но поддерживаемый большинством современных компиляторов.
альтернатива должна использовать, включают защиту (например, #ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */
)