#pragmaসি এর কয়েকটি ব্যবহার কি উদাহরণ সহ?
#pragmaসি এর কয়েকটি ব্যবহার কি উদাহরণ সহ?
উত্তর:
#pragma মেশিন-নির্দিষ্ট বা অপারেটিং-সিস্টেম-নির্দিষ্ট, এমনটি সংকলক নির্দেশিকাগুলির জন্য, যেমন এটি কম্পাইলারকে কিছু করতে, কিছু বিকল্প নির্ধারণ করে, কিছু পদক্ষেপ নিতে, কিছু ডিফল্ট ওভাররাইড করে, ইত্যাদি যা সমস্ত মেশিনে প্রযোজ্য বা অপারেটিং হতে পারে সিস্টেম।
আরও তথ্যের জন্য এমএসডিএন দেখুন ।
#pragma সি তে বাস্তবায়ন-সুনির্দিষ্ট কিছু করার জন্য ব্যবহৃত হয়, যেমন আদর্শিক দিক থেকে কৌতূহলবাদী না হয়ে বর্তমান প্রেক্ষাপটের জন্য বাস্তববাদী হোন।
আমি নিয়মিত যেটি ব্যবহার করি তা হ'ল #pragma pack(1)আমি এম্বেড থাকা সমাধানগুলিতে আমার স্মৃতি স্থান থেকে আরও বেশি বার করার চেষ্টা করছি, কাঠামোগুলির অ্যারেগুলি যা অন্যথায় 8 বাইট সারিবদ্ধকরণের সাথে শেষ হবে।
করুণা আমাদের #dogmaএখনও নেই। মজা হবে;)
pragma(1)বাস্তবিকভাবে গতিও উন্নত করে না? দেখুন stackoverflow.com/questions/3318410/...
আমি যদি সম্ভব হয় তবে #Pragmas ব্যবহার এড়াতে চেষ্টা করব, কারণ তারা চূড়ান্তভাবে সংকলক নির্ভর এবং অ-বহনযোগ্য। আপনি যদি সেগুলি পোর্টেবল ফ্যাশনে ব্যবহার করতে চান তবে আপনাকে প্রতিটি যুগ্মকে একটি #if/ #endifজোড়া দিয়ে ঘিরে ফেলতে হবে । জিসিসি প্রাগমাসের ব্যবহারকে নিরুৎসাহিত করে এবং সত্যই কেবল তাদের কয়েকটিকে অন্যান্য সংকলকগুলির সাথে সামঞ্জস্য করার জন্য সমর্থন করে; অন্যান্য সংকলকরা প্রাগমাস ব্যবহার করে একই জিনিসগুলি করার অন্যান্য উপায় রয়েছে।
উদাহরণস্বরূপ, আপনি কীভাবে নিশ্চিত করতে পারেন যে এমএসভিসিতে কোনও কাঠামো শক্তভাবে প্যাক করা হয়েছে (অর্থাত্ সদস্যদের মধ্যে কোনও প্যাড নেই):
#pragma pack(push, 1)
struct PackedStructure
{
char a;
int b;
short c;
};
#pragma pack(pop)
// sizeof(PackedStructure) == 7
আপনি জিসিসিতে একই জিনিসটি কীভাবে করতে চান তা এখানে:
struct PackedStructure __attribute__((__packed__))
{
char a;
int b;
short c;
};
// sizeof(PackedStructure == 7)
জিসিসি কোডটি আরও পোর্টেবল, কারণ আপনি যদি এটি কোনও নন-জিসিসি সংকলক দিয়ে সংকলন করতে চান তবে আপনাকে যা করতে হবে তা হ'ল
#define __attribute__(x)
আপনি যদি এমএসভিসি কোডটি পোর্ট করতে চান তবে আপনাকে প্রতিটি প্রগমা একটি #if/ #endifজোড়া দিয়ে ঘিরে রাখতে হবে । না সুন্দর.
struct __attribute__((__packed__)) PackedStructure
hackপ্রগমার মুখোমুখি হয় তবে এটি চেনা যায় না, যেহেতু এটি অনেক আগে খুব বেশিদিন আগে করত - দেখুন #pragmaএবং জিসিসি ইত্যাদি)
ফেলে #pragma onceআপনার হেডার ফাইল উপরের নিশ্চিত করবে যে এটা শুধুমাত্র একবার অন্তর্ভুক্ত করা হয়। নোট যেটি #pragma onceস্ট্যান্ডার্ড সি 99 নয়, তবে বেশিরভাগ আধুনিক সংকলক দ্বারা সমর্থিত।
বিকল্প হিসাবে রক্ষীদের অন্তর্ভুক্ত ব্যবহার করা হয় (উদাঃ #ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */)
আমি যা অনুভব করি তা #pragmaহ'ল একটি নির্দেশনা যেখানে আপনি যদি কোডটি নির্দিষ্ট করে নির্দিষ্ট করতে চান। আপনি যদি এমন একটি পরিস্থিতি বলুন যেখানে আপনি আইএসআর লেখা আছে সেই নির্দিষ্ট ঠিকানা থেকে প্রোগ্রামের কাউন্টারটি পড়তে চান তবে আপনি সেই স্থানে আইএসআর নির্দিষ্ট করতে পারেন #pragma vector=ADC12_VECTORএবং অনুসরণ করে অনুসরণ করতে পারেন নাম এবং এর বিবরণে বাধা দেয়
আমার সেরা পরামর্শটি হ'ল আপনার সংকলকের ডকুমেন্টেশনগুলি দেখুন, কারণ প্রগমাস সংজ্ঞা বাস্তবায়ন-দ্বারা নির্দিষ্ট। উদাহরণস্বরূপ, এম্বেড থাকা প্রকল্পগুলিতে আমি তাদের ব্যবহার করেছি বিভিন্ন বিভাগে কোড এবং ডেটা সনাক্ত করতে, বা বিঘ্নিত হ্যান্ডলারগুলি ঘোষণা করতে। অর্থাৎ,
#pragma code BANK1
#pragma data BANK2
#pragma INT3 TimerHandler
উপরের সমস্ত উত্তরগুলির জন্য ভাল ব্যাখ্যা দেয় #pragmaতবে আমি একটি ছোট উদাহরণ যুক্ত করতে চাই
আমি কেবল একটি ব্যাখ্যা করতে চাই যা এর কাজটি করার simple OpenMP exampleকিছু ব্যবহার প্রদর্শন করে#pragma
ওপেনএমপি
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।