#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, #dogma
henü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
hack
tanımadığı bir pragma ile karşılaştığında çalışıyorsa uyumsuz hale getirir , çok çok uzun zaman önce yaptığı gibi - bkz. #pragma
Ve GCC , vb.)
#pragma once
Başlık dosyanızın en üstüne koymak , yalnızca bir kez eklenmesini sağlayacaktır. Bunun #pragma once
standart 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 */
)
#pragma
Benim 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_VECTOR
ISR'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 #pragma
ama küçük bir örnek eklemek istedim
Ben sadece işini yapmanın simple OpenMP example
bazı kullanımlarını gösteren bir#pragma
OpenMp
briefly
, çok platformlu paylaşılan bellek paralel programlama için bir uygulamadır (o zamanmachine-specific
ya 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 #pragma
yaptığını söyleyeyim ...
OS'ye bazı kod bloğunu 4 iş parçacığı üzerinde çalıştırmasını söyler
bu many many applications
küçü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 exit
ve #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.
#pragma
Derleyiciyi 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 main
ve func2
sonra 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 func1
ve func2
beğ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:
#pragma
derleyici 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ü libportable
bunu 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 .
#pragma
direktif, ön işleme aşamasında hayatta kalır. Aksine#include
ve#define
.