#pragmaÖrneklerle birlikte C'de bazı kullanım alanları nelerdir ?
#pragmaÖrneklerle birlikte C'de bazı kullanım alanları nelerdir ?
Yanıtlar:
#pragma makineye özgü veya işletim sistemine özgü derleyici yönergeleri içindir, yani derleyiciye bir şeyler yapmasını, bazı seçenekleri ayarlamasını, bazı eylemlerde bulunmasını, bazı varsayılanları geçersiz kılmalarını, vb. tüm makineler ve işletim için geçerli olabilecek veya olmayabilecek sistemleri.
Daha fazla bilgi için msdn'ye bakın .
#pragma C'de uygulamaya özgü bir şey yapmak için kullanılır, yani ideolojik olarak dogmatik olmaktan ziyade mevcut bağlam için pragmatik olun.
Düzenli olarak kullandığım şey #pragma pack(1), gömülü çözümlerde bellek alanımdan, aksi takdirde 8 bayt hizalamayla sonuçlanacak yapı dizileri ile daha fazla sıkmaya çalıştığım yerdir.
Yazık, #dogmahenüz sahip değiliz . Bu eğlenceli olurdu;)
pragma(1)Hızı gerçekten de artırmıyor mu ? Stackoverflow.com/questions/3318410/… sayfasına
Derleyiciye aşırı derecede bağımlı olduklarından ve taşınabilir olmadıklarından, genellikle mümkünse #pragmalardan kaçınmaya çalışırdım. Onları taşınabilir bir şekilde kullanmak istiyorsanız, her pragmayı bir #if/ #endifçifti ile çevrelemeniz gerekir . GCC, pragmaların kullanılmasını engeller ve gerçekten sadece bazılarını diğer derleyicilerle uyumluluk için destekler; GCC, diğer derleyicilerin pragmaları kullandıkları aynı şeyleri yapmanın başka yollarına sahiptir.
Örneğin, MSVC'de bir yapının sıkı bir şekilde paketlenmesini (yani üyeler arasında dolgu yapılmamasını) nasıl sağlayacağınız aşağıda açıklanmıştır:
#pragma pack(push, 1)
struct PackedStructure
{
char a;
int b;
short c;
};
#pragma pack(pop)
// sizeof(PackedStructure) == 7
GCC'de aynı şeyi şu şekilde yaparsınız:
struct PackedStructure __attribute__((__packed__))
{
char a;
int b;
short c;
};
// sizeof(PackedStructure == 7)
GCC kodu daha taşınabilirdir, çünkü bunu GCC olmayan bir derleyici ile derlemek istiyorsanız tek yapmanız gereken
#define __attribute__(x)
Oysa MSVC kodunu taşımak istiyorsanız, her pragmayı bir #if/ #endifçifti ile çevrelemelisiniz . Güzel değil.
struct __attribute__((__packed__)) PackedStructure
hacktanımadığı bir pragma ile karşılaştığında çalışıyorsa uyumsuz hale getirir , çok çok uzun zaman önce yaptığı gibi - bkz. #pragmaVe GCC , vb.)
#pragma onceBaşlık dosyanızın en üstüne koymak , yalnızca bir kez eklenmesini sağlayacaktır. Bunun #pragma oncestandart C99 olmadığını, ancak çoğu modern derleyici tarafından desteklendiğini unutmayın.
Bir alternatif dahil korumaları kullanmaktır (ör. #ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */)
#pragmaBenim hissettiğim şey , kodun konuma özgü olmasını istiyorsanız, program sayacının ISR'nin yazıldığı belirli bir adresten okumasını istediğiniz bir durumu söylerseniz, o konumda #pragma vector=ADC12_VECTORISR'yi kullanarak ve aşağıdakini kullanarak belirtebilirsiniz: interrupt rotines adı ve açıklaması
En iyi tavsiyem, derleyicinizin belgelerine bakmaktır, çünkü pragmalar tanım gereği uygulamaya özgüdür. Örneğin, gömülü projelerde farklı bölümlerdeki kodu ve verileri bulmak veya kesme işleyicileri bildirmek için kullandım. yani:
#pragma code BANK1
#pragma data BANK2
#pragma INT3 TimerHandler
Yukarıdaki tüm cevaplar için güzel açıklamalar yapıyor #pragmaama küçük bir örnek eklemek istedim
Ben sadece işini yapmanın simple OpenMP examplebazı kullanımlarını gösteren bir#pragma
OpenMp
briefly, çok platformlu paylaşılan bellek paralel programlama için bir uygulamadır (o zamanmachine-specificya da diyebilirizoperating-system-specific)
hadi örneğe gidelim
#include <stdio.h>
#include <omp.h>// compile with: /openmp
int main() {
#pragma omp parallel num_threads(4)
{
int i = omp_get_thread_num();
printf_s("Hello from thread %d\n", i);
}
}
çıktı
Hello from thread 0
Hello from thread 1
Hello from thread 2
Hello from thread 3
Note that the order of output can vary on different machines.
şimdi ne #pragmayaptığını söyleyeyim ...
OS'ye bazı kod bloğunu 4 iş parçacığı üzerinde çalıştırmasını söyler
bu many many applicationsküçük şeylerle yapabileceğiniz şeylerden sadece biri#pragma
dış örnek için özür dilerim OpenMP
Bu, belirli özellikleri açmak veya kapatmak için kullanılabilen bir ön işlemci yönergesidir.
Bu iki tip olduğu #pragma startup, #pragma exitve #pragma warn.
#pragma startup program başlangıcında çağrılan işlevleri belirlememize izin verir.
#pragma exit programdan çıkıldığında çağrılan fonksiyonları belirlememize izin verir.
#pragma warn bilgisayara herhangi bir uyarıyı engellemesini söyler.
#pragmaDerleyiciyi kontrol etmek için diğer birçok stil kullanılabilir.
#pragma startup ana işlevden önce bir işlevi çağırmak ve ana işlevden sonra başka bir işlevi çağırmak için kullanılan bir yönergedir, örn.
#pragma startup func1
#pragma exit func2
Burada func1önce koşuyor mainve func2sonra koşuyor.
NOT: Bu kod yalnızca Turbo-C derleyicisinde çalışır. GCC'de bu işlevselliği elde etmek için, şunları beyan edebilir func1ve func2beğenebilirsiniz:
void __attribute__((constructor)) func1();
void __attribute__((destructor)) func2();
Özetlemek gerekirse #pragma, derleyiciye bir şeyler yapmasını söyler. İşte onu kullanmamın birkaç yolu:
#pragmaderleyici uyarılarını yok saymak için kullanılabilir. Örneğin, GCC'nin örtük işlev bildirimleri hakkında susmasını sağlamak için şunu yazabilirsiniz:
#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
Eski bir sürümü libportablebunu taşınabilir bir şekilde yapar .
#pragma once, bir başlık dosyasının en üstüne yazıldığında, adı geçen başlık dosyasının bir kez eklenmesine neden olur. destek bir kez pragma için libportable kontrol eder .
#pragmadirektif, ön işleme aşamasında hayatta kalır. Aksine#includeve#define.