در این مقاله از نشانیهای وب عریان استفاده شده است که مستعد خراب شدن پیوند هستند. |
برای تأییدپذیری کامل این مقاله به منابع بیشتری نیاز است. |
این مقاله شبیه یک کتابچهٔ راهنما یا خودآموز نوشته شدهاست. |
در زبان برنامهنویسی سی و سی++، #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++ | پشتیبانی میکند.[۱۰] |