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++ پشتیبانی می‌کند.[۲]
C++Builder XE3 پشتیبانی می‌کند.[۳]
Digital Mars C++ پشتیبانی می‌کند.[۴]
GCC پشتیبانی می‌کند.[۵] (since 3.4[۶])
Intel C++ Compiler پشتیبانی می‌کند.[۷]
ویژوال سی++ پشتیبانی می‌کند.[۸]
Pelles C پشتیبانی می‌کند.[۹]
IAR C/C++ پشتیبانی می‌کند.[۱۰]

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

  • مشارکت‌کنندگان ویکی‌پدیا، «pragma once»، ویکی‌پدیای انگلیسی، دانشنامهٔ آزاد (بازیابی در ۱ شهریور ۱۳۹۲).
  1. "clang: clang: Pragma.cpp Source File". Clang.llvm.org. Retrieved 2013-08-19. 
  2. "Comeau C++ Pre-Release User Documentation: Pragmas". Comeaucomputing.com. 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. http://secure-software.intel.com/en-us/articles/cdiag1782/#comment-9466
  8. "once (C/C++)". Msdn.microsoft.com. Retrieved 2013-08-19. 
  9. IDE help/documentation
  10. ftp://ftp.iar.se/WWWfiles/arm/webic/doc/EWARM_DevelopmentGuide.ENU.pdf