Разница между #pragma и _Pragma () в C

В чем разница между #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 с примером.