Apa saja kegunaan #pragma
dalam C, dengan contoh?
Apa saja kegunaan #pragma
dalam C, dengan contoh?
Jawaban:
#pragma
adalah untuk arahan kompilator yang khusus mesin atau khusus sistem operasi, yaitu ia memberitahu kompilator untuk melakukan sesuatu, mengatur beberapa opsi, mengambil beberapa tindakan, mengganti beberapa default, dll. Yang mungkin atau mungkin tidak berlaku untuk semua mesin dan operasi sistem.
Lihat msdn untuk info lebih lanjut.
#pragma
digunakan untuk melakukan sesuatu yang spesifik-implementasi di C, yaitu bersikap pragmatis untuk konteks saat ini daripada dogmatis ideologis.
Yang saya gunakan secara teratur adalah di #pragma pack(1)
mana saya mencoba memeras lebih banyak dari ruang memori saya pada solusi yang disematkan, dengan susunan struktur yang jika tidak akan berakhir dengan penyelarasan 8 byte.
Sayang kami belum punya #dogma
. Itu akan menyenangkan ;)
pragma(1)
meningkatkan kecepatan juga? Lihat stackoverflow.com/questions/3318410/…
Saya biasanya akan mencoba untuk menghindari penggunaan #pragmas jika memungkinkan, karena mereka sangat bergantung pada kompiler dan tidak portabel. Jika Anda ingin menggunakannya secara portabel, Anda harus mengelilingi setiap pragma dengan pasangan #if
/ #endif
. GCC melarang penggunaan pragma, dan benar-benar hanya mendukung beberapa di antaranya untuk kompatibilitas dengan kompiler lain; GCC memiliki cara lain untuk melakukan hal yang sama dengan yang digunakan oleh kompiler lain untuk pragma.
Misalnya, berikut cara Anda memastikan bahwa struktur dikemas dengan rapat (yaitu, tidak ada bantalan antar anggota) di MSVC:
#pragma pack(push, 1)
struct PackedStructure
{
char a;
int b;
short c;
};
#pragma pack(pop)
// sizeof(PackedStructure) == 7
Berikut cara Anda melakukan hal yang sama di GCC:
struct PackedStructure __attribute__((__packed__))
{
char a;
int b;
short c;
};
// sizeof(PackedStructure == 7)
Kode GCC lebih portabel, karena jika Anda ingin mengkompilasinya dengan kompiler non-GCC, yang harus Anda lakukan adalah
#define __attribute__(x)
Sedangkan jika Anda ingin mem-port kode MSVC, Anda harus mengelilingi setiap pragma dengan #if
/ #endif
pair. Tidak cantik.
struct __attribute__((__packed__)) PackedStructure
hack
saat menemukan pragma yang tidak dikenali, seperti yang dulu pernah dilakukan - lihat #pragma
dan GCC , dll.)
Menempatkan #pragma once
di bagian atas file header Anda akan memastikan bahwa itu hanya disertakan sekali. Perhatikan bahwa #pragma once
ini bukan C99 standar, tetapi didukung oleh sebagian besar kompiler modern.
Alternatifnya adalah dengan menggunakan termasuk penjaga (misalnya #ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */
)
apa yang saya rasakan adalah #pragma
arahan di mana jika Anda ingin kode menjadi lokasi tertentu. katakan situasi di mana Anda ingin penghitung program membaca dari alamat tertentu di mana ISR ditulis maka Anda dapat menentukan ISR di lokasi itu menggunakan #pragma vector=ADC12_VECTOR
dan diikuti oleh interrupt rotines name dan deskripsinya
Saran terbaik saya adalah melihat dokumentasi kompiler Anda, karena pragma menurut definisi spesifik-implementasi. Misalnya, dalam proyek yang disematkan saya telah menggunakannya untuk menemukan kode dan data di bagian yang berbeda, atau mendeklarasikan penangan interupsi. yaitu:
#pragma code BANK1
#pragma data BANK2
#pragma INT3 TimerHandler
Semua jawaban di atas membuat penjelasan yang bagus untuk #pragma
tetapi saya ingin menambahkan contoh kecil
Saya hanya ingin menjelaskan simple OpenMP example
yang menunjukkan beberapa kegunaan #pragma
untuk melakukan tugasnya
OpenMp
briefly
adalah implementasi untuk pemrograman paralel memori bersama multi-platform (maka kita dapat mengatakannyamachine-specific
atauoperating-system-specific
)
mari kita pergi ke contoh
#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);
}
}
hasilnya adalah
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.
sekarang izinkan saya memberi tahu Anda apa yang #pragma
...
itu memberitahu OS untuk menjalankan beberapa blok kode pada 4 utas
ini hanya salah satu many many applications
yang dapat Anda lakukan dengan yang kecil#pragma
maaf untuk sampel luarnya OpenMP
Ini adalah arahan preprocessor yang dapat digunakan untuk menghidupkan atau mematikan fitur tertentu.
Ini terdiri dari dua jenis #pragma startup
, #pragma exit
dan #pragma warn
.
#pragma startup
memungkinkan kita untuk menentukan fungsi yang dipanggil saat program dimulai.
#pragma exit
memungkinkan kita untuk menentukan fungsi yang dipanggil saat keluar dari program.
#pragma warn
memberitahu komputer untuk menekan peringatan apapun atau tidak.
Banyak #pragma
gaya lain yang dapat digunakan untuk mengontrol kompilator.
#pragma startup
adalah arahan yang digunakan untuk memanggil suatu fungsi sebelum fungsi utama dan untuk memanggil fungsi lain setelah fungsi utama, misalnya
#pragma startup func1
#pragma exit func2
Di sini, func1
berlari sebelum main
dan func2
sesudahnya.
CATATAN: Kode ini hanya berfungsi di kompiler Turbo-C. Untuk mencapai fungsi ini di GCC, Anda dapat mendeklarasikan func1
dan func2
menyukai ini:
void __attribute__((constructor)) func1();
void __attribute__((destructor)) func2();
Singkatnya, #pragma
beri tahu kompiler untuk melakukan sesuatu. Berikut beberapa cara saya menggunakannya:
#pragma
bisa digunakan untuk mengabaikan peringatan kompilator. Misalnya, untuk membuat GCC tutup mulut tentang deklarasi fungsi implisit, Anda dapat menulis:
#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
Versi lama dari libportable
melakukan hal ini portable .
#pragma once
, jika ditulis di bagian atas file header, akan menyebabkan file header tersebut dimasukkan sekali. libportable
memeriksa pragma setelah dukungan.
#pragma
arahan bertahan dari tahap pra-pemrosesan. Tidak seperti#include
dan#define
.