В чем разница между #pragma
и _Pragma()
в C?
синтаксис:
#pragma arg
а также
_Pragma(arg)
Когда следует использовать _Pragma(arg)
?
Отсюда :
Директивы Pragma указывают особенности компилятора, относящиеся к машине или операционной системе. Ключевое слово __pragma, которое является специфическим для компилятора Microsoft , позволяет вам закодировать директивы pragma в определениях макросов.
Также (та же ссылка):
Ключевое слово __pragma ()
Microsoft
Компилятор также поддерживает ключевое слово
__pragma
, которое имеет те же функции, что и директива#pragma
, но может использоваться inline в определении макроса. Директива#pragma
не может использоваться в определении макроса, потому что компилятор интерпретирует символ знака числа (‘#’) в директиве как оператор стробирования (#).
Поэтому в основном вы всегда можете использовать #pragma
вместо __pragma()
. Нет необходимости использовать __pragma()
, но иногда его можно использовать.
Оператор _Pragma
введенный в C99
. _Pragma(arg)
– это оператор, похожий на sizeof
или defined
, и может быть встроен в макрос.
Согласно ссылке cpp.gnu.org :
Его синтаксис
_Pragma (string-literal);
где string-literal может быть либо строковым, либо строковым литералом. Он уничтожается, заменяя все \ на единицу \ и все \ “на” . Результат обрабатывается так, как если бы он появился как правая часть директивы #pragma . Например,
_Pragma ("GCC dependency \"parse.y\"") has the same effect as #pragma GCC dependency "parse.y".
Тот же эффект может быть достигнут с использованием макросов, например
#define DO_PRAGMA(x) _Pragma (#x) DO_PRAGMA (GCC dependency "parse.y")
Согласно учебнику IBM :
Оператор _Pragma является альтернативным методом указания директив #pragma. Например, следующие два утверждения эквивалентны:
#pragma comment(copyright, "IBM 2010") _Pragma("comment(copyright, \"IBM 2010\")")
Строка IBM 2010 вставляется в объектный файл C ++ при компиляции следующего кода:
_Pragma("comment(copyright, \"IBM 2010\")") int main() { return 0; }
Для получения дополнительной информации о _pragma с примером.