Перевага від продуктивності полягає в тому, що не потрібно знову відкривати файл після того, як #pragma один раз буде прочитаний. За допомогою охоронців компілятору потрібно відкрити файл (що може затратити час), щоб отримати інформацію про те, що він не повинен знову включати його вміст.
Це теорія лише тому, що деякі компілятори автоматично не відкриватимуть файли, у яких не було прочитаного коду, для кожного блоку компіляції.
Так чи інакше, це стосується не всіх компіляторів, тому в ідеалі #pragma одного разу потрібно уникати для кросплатформенного коду, якщо він взагалі не є стандартним / не має стандартизованого визначення та ефекту. Однак практично це справді краще, ніж охоронці.
Зрештою, кращою пропозицією, яку ви можете переконатись у тому, щоб забезпечити найкращу швидкість роботи вашого компілятора, не перевіряючи поведінку кожного компілятора в цьому випадку, є використання як прагми один раз, так і охоронців.
#ifndef NR_TEST_H
#define NR_TEST_H
#pragma once
#include "Thing.h"
namespace MyApp
{
// ...
}
#endif
Таким чином ви отримуєте найкраще з обох (кросплатформна та швидкість компіляції).
Оскільки вводити довше, я особисто використовую інструмент, який допомагає генерувати все це дуже хитро (Visual Assist X).
#pragma once
здається, уникнути деяких проблем із переглядом класу у VS 2008. Я з цього приводу позбувся включення охоронців та замінив їх усіма#pragma once
.