#pragma
उदाहरण के साथ, C के कुछ उपयोग क्या हैं ?
#pragma
उदाहरण के साथ, C के कुछ उपयोग क्या हैं ?
जवाबों:
#pragma
कंपाइलर निर्देशों के लिए जो मशीन-विशिष्ट या ऑपरेटिंग-सिस्टम-विशिष्ट हैं, अर्थात यह कंपाइलर को कुछ करने, कुछ विकल्प निर्धारित करने, कुछ कार्रवाई करने, कुछ डिफ़ॉल्ट को ओवरराइड करने आदि के लिए कहता है जो सभी मशीनों और ऑपरेटिंग पर लागू हो सकता है या नहीं। सिस्टम।
अधिक जानकारी के लिए देखें msdn ।
#pragma
C के कार्यान्वयन-विशिष्ट करने के लिए उपयोग किया जाता है, अर्थात वैचारिक रूप से हठधर्मिता के बजाय वर्तमान संदर्भ के लिए व्यावहारिक होना चाहिए।
एक मैं नियमित रूप से उपयोग करता हूं, #pragma pack(1)
जहां मैं एम्बेडेड समाधानों पर अपनी मेमोरी स्पेस से अधिक निचोड़ने की कोशिश कर रहा हूं, संरचनाओं के सरणियों के साथ जो अन्यथा 8 बाइट संरेखण के साथ समाप्त हो जाएंगे।
अफ़सोस कि हमारे पास #dogma
अभी तक नहीं है। वो मजेदार होगा ;)
pragma(1)
गति में भी सुधार नहीं करता है? देखें stackoverflow.com/questions/3318410/…
मैं आमतौर पर अगर संभव हो तो #pragmas के उपयोग से बचने की कोशिश करूंगा, क्योंकि वे बेहद संकलक और गैर-पोर्टेबल हैं। आप उन्हें एक पोर्टेबल फैशन में उपयोग करना चाहते हैं, तो आप एक साथ हर pragma घेर करना होगा #if
/ #endif
जोड़ी। जीसीसी प्रागमस के उपयोग को हतोत्साहित करता है, और वास्तव में उनमें से कुछ अन्य संकलक के साथ संगतता के लिए समर्थन करता है; जीसीसी के पास वही काम करने के अन्य तरीके हैं जिनके लिए अन्य कंपाइलर प्रैग्मस का उपयोग करते हैं।
उदाहरण के लिए, यहां बताया गया है कि आप यह सुनिश्चित करेंगे कि MSVC में एक संरचना कसकर पैक की गई हो (यानी सदस्यों के बीच कोई पैडिंग नहीं):
#pragma pack(push, 1)
struct PackedStructure
{
char a;
int b;
short c;
};
#pragma pack(pop)
// sizeof(PackedStructure) == 7
यहाँ आप GCC में यही काम करेंगे:
struct PackedStructure __attribute__((__packed__))
{
char a;
int b;
short c;
};
// sizeof(PackedStructure == 7)
जीसीसी कोड अधिक पोर्टेबल है, क्योंकि यदि आप यह संकलित करना चाहते हैं कि एक गैर-जीसीसी संकलक के साथ, आपको बस इतना करना है
#define __attribute__(x)
जबकि यदि आप MSVC कोड को पोर्ट करना चाहते हैं, तो आपको प्रत्येक प्राग #if
/ a #endif
जोड़ी के साथ घेरना होगा । सुंदर नहीं।
struct __attribute__((__packed__)) PackedStructure
hack
तब चलता है जब यह एक ऐसे संघर्ष का सामना करता है जो इसे पहचानता नहीं है, क्योंकि यह एक बार बहुत पहले, बहुत समय पहले देखता था - #pragma
और जीसीसी , आदि)
लाना #pragma once
अपने हेडर फाइल के शीर्ष पर यह सुनिश्चित करेंगे कि यह केवल एक बार शामिल किया गया है। ध्यान दें कि #pragma once
मानक C99 नहीं है, लेकिन अधिकांश आधुनिक संकलक द्वारा समर्थित है।
एक विकल्प के लिए गार्ड शामिल हैं (जैसे #ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */
)
मुझे लगता है #pragma
कि एक निर्देश है जहां यदि आप चाहते हैं कि कोड विशिष्ट स्थान पर हो। तो ऐसी स्थिति में जब आप चाहते हैं कि प्रोग्राम काउंटर उस विशिष्ट पते से पढ़ें जहां ISR लिखा गया है तो आप उस स्थान पर ISR का उपयोग करके #pragma vector=ADC12_VECTOR
और उसका अनुसरण करके निर्दिष्ट कर सकते हैं। इंटरप्ट रोटाइन नाम और उसका विवरण
मेरी सबसे अच्छी सलाह है कि आप अपने कंपाइलर के डॉक्यूमेंटेशन को देखें, क्योंकि प्रैग्मेंट्स डेफिनिशन इम्प्लीमेंट-स्पेशल हैं। उदाहरण के लिए, एम्बेडेड प्रोजेक्ट्स में मैंने उन्हें अलग-अलग वर्गों में कोड और डेटा का पता लगाने के लिए उपयोग किया है, या बाधित हैंडलर घोषित किया है। अर्थात:
#pragma code BANK1
#pragma data BANK2
#pragma INT3 TimerHandler
उपरोक्त सभी उत्तर अच्छी व्याख्याएँ करते हैं, #pragma
लेकिन मैं एक छोटा सा उदाहरण जोड़ना चाहता था
मैं बस यह समझाना चाहता हूं simple OpenMP example
कि #pragma
अपने काम करने के कुछ उपयोगों को प्रदर्शित करता है
OpenMp
briefly
मल्टी-प्लेटफॉर्म साझा-मेमोरी समानांतर प्रोग्रामिंग के लिए एक कार्यान्वयन है (फिर हम कह सकते हैं कि यहmachine-specific
या हैoperating-system-specific
)
उदाहरण के लिए चलते हैं
#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);
}
}
आउटपुट है
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.
अब मैं आपको बताता हूँ कि क्या #pragma
किया ...
यह ओएस को 4 थ्रेड्स पर कोड के कुछ ब्लॉक को चलाने के लिए कहता है
यह आप में से एक है many many applications
जो छोटे के साथ कर सकता है#pragma
बाहर के नमूने के लिए खेद है OpenMP
यह एक प्रीप्रोसेसर निर्देश है जिसका उपयोग कुछ विशेषताओं को चालू या बंद करने के लिए किया जा सकता है।
यह दो प्रकार का होता है #pragma startup
, #pragma exit
और #pragma warn
।
#pragma startup
कार्यक्रम स्टार्टअप पर बुलाया कार्यों को निर्दिष्ट करने की अनुमति देता है।
#pragma exit
हमें प्रोग्राम से बाहर निकलने पर होने वाले कार्यों को निर्दिष्ट करने की अनुमति देता है।
#pragma warn
किसी भी चेतावनी को दबाने के लिए कंप्यूटर को बताता है या नहीं।
#pragma
संकलक को नियंत्रित करने के लिए कई अन्य शैलियों का उपयोग किया जा सकता है।
#pragma startup
एक निर्देश है जिसका उपयोग मुख्य कार्य से पहले एक फ़ंक्शन को कॉल करने और मुख्य फ़ंक्शन के बाद किसी अन्य फ़ंक्शन को कॉल करने के लिए किया जाता है, जैसे
#pragma startup func1
#pragma exit func2
यहाँ, func1
पहले चलता है main
और func2
बाद में चलता है।
नोट: यह कोड केवल टर्बो-सी कंपाइलर में काम करता है। जीसीसी में इस कार्यक्षमता को प्राप्त करने, आप घोषणा कर सकते हैं func1
और func2
इस तरह:
void __attribute__((constructor)) func1();
void __attribute__((destructor)) func2();
इसे योग करने के लिए, #pragma
संकलक को सामान करने के लिए कहता है। यहाँ कुछ तरीके हैं जो मैं इसका उपयोग करता हूँ:
#pragma
संकलक चेतावनी को नजरअंदाज करने के लिए इस्तेमाल किया जा सकता है। उदाहरण के लिए, अंतर्निहित फ़ंक्शन घोषणाओं के बारे में जीसीसी को बंद करने के लिए, आप लिख सकते हैं:
#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
एक पुराने संस्करण को libportable
यह आंशिक रूप से करता है ।
#pragma once
, जब हेडर फ़ाइल के शीर्ष पर लिखा जाता है, तो हेडर फ़ाइल को एक बार शामिल करने का कारण होगा। एक बार समर्थन के लिए प्रगति की libportable
जाँच करता है ।
#pragma
निर्देशन पूर्व-प्रसंस्करण अवस्था में जीवित रहता है। के विपरीत#include
और#define
।