pragma once

از ویکی‌پدیا، دانشنامهٔ آزاد

در زبان برنامه‌نویسی سی و سی++، ‎#pragma once، یکی از دستورهای غیر استاندارد پیش‌پردازنده است که اگر در فایلی قرار داده شود، فایل مورد نظر تنها یک بار در هر بار کامپایل درج خواهد شد. هر چند که این دستور غیر استاندارد است، اما به‌طور گسترده توسط کامپایلرهای مختلف پشتیبانی می‌شود. این دستور عملکردی مشابه اینکلود گارد دارد. اما استفاده از ‎#pragma once مزایایی نسبت به اینکلود گارد دارد که کد کمتر، جلوگیری از تصادم و برخورد اسامی و کاهش زمان کامپایل (در برخی مواقع) از جمله مزایای استفاده از ‎#pragma once هستند.

مثال[ویرایش]

فایل "grandparent.h":

#pragma once

struct foo 
{
    int member;
};

فایل "parent.h":

#include "grandparent.h"

فایل "child.c":

#include "grandparent.h"
#include "parent.h"

در صورتی که از ‎#pragma once در فایل grandparent.h استفاده نشود، فایل child.c به شکل زیر در خواهد آمد:

struct foo 
{
    int member;
};

struct foo 
{
    int member;
};

که یک خطای نحوی در بر خواهد داشت. چرا که ساختار foo دو بار تعریف شده که خطاست. اما با قرار دادن دستور ‎#pragma once در فایل grandparent.h این مشکل برطرف می‌شود.

مزایا و معایب[ویرایش]

استفاده از ‎#pragma once در برخی از کامپالرها باعث می‌شود که مدت زمان کامپایل برنامه کاهش یابد، چرا که این دستور نسبت به اینکلود گارد سطح بالاتر است. خود کامپایلر می‌تواند نام فایل‌ها یا شماره آینود فایل‌ها را با هم مقایسه کند و آن‌ها را مدیریت کند. اما استفاده از اینکلود گارد، نیازمند فراخوانی کردن پیش‌پردازنده برای پویش کردن ‎#ifndef و ‎#endif است.

برخی از کامپایلرها نظیر جی‌سی‌سی و کلنگ، کدهای مخصوصی دارند که به کمک آن‌ها می‌توانند اینکلود گاردها را با سرعت زیاد و بهینه مدیریت کنند، بنابراین استفاده از ‎#pragma once در این کامپایلرها تأثیر کمی دارد یا اصلاً بدون تأثیر است.

همانطور که گفته شد، به خاطر اینکه کامپایلر خودش و بدون نیاز به پیش‌پردازنده دستور ‎#pragma once را مدیریت می‌کند، برنامه‌نویس مجبور نیست یک ماکروی خاص مانند GRANDPARENT_H در مثال اینکلود گارد را ایجاد کند. این کار خطر تداخل اسامی را از بین می‌برد و درج کردن فایل‌های سرایند با شکست مواجه نمی‌شود.

قابل حمل بودن[ویرایش]

نام کامپایلر #pragma once
Clang پشتیبانی می‌کند.[۱]
Comeau C/C++ پشتیبانی می‌کند.[۲]
سی++بیلدر پشتیبانی می‌کند.[۳]
Digital Mars C++ پشتیبانی می‌کند.[۴]
GCC پشتیبانی می‌کند.[۵] (since 3.4[۶])
Intel C++ Compiler پشتیبانی می‌کند.[۷]
ویژوال سی++ پشتیبانی می‌کند.[۸]
Pelles C پشتیبانی می‌کند.[۹]
IAR C/C++ پشتیبانی می‌کند.[۱۰]

منابع[ویرایش]

  1. "clang: clang: Pragma.cpp Source File". Clang.llvm.org. Archived from the original on 4 April 2014. Retrieved 2013-08-19.
  2. "Comeau C++ Pre-Release User Documentation: Pragmas". Comeaucomputing.com. Archived from the original on 11 December 2013. Retrieved 2013-08-19.
  3. "#pragma once - RAD Studio XE3". Docwiki.embarcadero.com. 2010-12-02. Retrieved 2013-08-19.
  4. "Pragmas". Digital Mars. Retrieved 2013-08-19.
  5. "Alternatives to Wrapper #ifndef". Gcc.gnu.org. Retrieved 2013-08-20.
  6. "GCC 3.4 Release Series — Changes, New Features, and Fixes". Gcc.gnu.org. Retrieved 2013-08-19.
  7. «نسخه آرشیو شده». بایگانی‌شده از اصلی در ۲۵ آوریل ۲۰۱۲. دریافت‌شده در ۲۳ اوت ۲۰۱۳.
  8. "once (C/C++)". Msdn.microsoft.com. Retrieved 2013-08-19.
  9. IDE help/documentation
  10. «نسخه آرشیو شده» (PDF). بایگانی‌شده از اصلی (PDF) در ۱۶ مه ۲۰۱۷. دریافت‌شده در ۲۳ اوت ۲۰۱۳.