সি তে #pragma ব্যবহার


117

#pragmaসি এর কয়েকটি ব্যবহার কি উদাহরণ সহ?


2
#pragmaনির্দেশ প্রাক প্রসেসিং পর্যায়ে বেঁচে থাকে। অপছন্দ #includeএবং #define
smwikedia


@ এসএমউইকিপিডিয়া বলতে কি কিছু প্রগমা বেঁচে আছে? #প্রাগমা একবার প্রিপ্রোসেসর নির্দেশিকা তবে # প্রাগমা প্যাকটি একটি সংকলক নির্দেশিকা
লুইস কেলসি ২

উত্তর:


66

#pragma মেশিন-নির্দিষ্ট বা অপারেটিং-সিস্টেম-নির্দিষ্ট, এমনটি সংকলক নির্দেশিকাগুলির জন্য, যেমন এটি কম্পাইলারকে কিছু করতে, কিছু বিকল্প নির্ধারণ করে, কিছু পদক্ষেপ নিতে, কিছু ডিফল্ট ওভাররাইড করে, ইত্যাদি যা সমস্ত মেশিনে প্রযোজ্য বা অপারেটিং হতে পারে সিস্টেম।

আরও তথ্যের জন্য এমএসডিএন দেখুন ।


11
"যা সমস্ত মেশিনে এবং অপারেটিং সিস্টেমে প্রয়োগ হতে পারে বা নাও লাগতে পারে।" - এবং একই মেশিনে বিভিন্ন সংকলক। এবং যার অর্থ বিভিন্ন সংকলকগুলিতে বিভিন্ন জিনিস হতে পারে।
স্টিভ জেসোপ

53

#pragma সি তে বাস্তবায়ন-সুনির্দিষ্ট কিছু করার জন্য ব্যবহৃত হয়, যেমন আদর্শিক দিক থেকে কৌতূহলবাদী না হয়ে বর্তমান প্রেক্ষাপটের জন্য বাস্তববাদী হোন।

আমি নিয়মিত যেটি ব্যবহার করি তা হ'ল #pragma pack(1)আমি এম্বেড থাকা সমাধানগুলিতে আমার স্মৃতি স্থান থেকে আরও বেশি বার করার চেষ্টা করছি, কাঠামোগুলির অ্যারেগুলি যা অন্যথায় 8 বাইট সারিবদ্ধকরণের সাথে শেষ হবে।

করুণা আমাদের #dogmaএখনও নেই। মজা হবে;)


@ শানেম্যাকলফলিন, pragma(1)বাস্তবিকভাবে গতিও উন্নত করে না? দেখুন stackoverflow.com/questions/3318410/...
Pacerier

4
@ পেসারিয়ার, সাধারণত না। জালফের মন্তব্য অনুসারে, 32 বিট প্রসেসরের 4 বাট বাউন্ডারে বা 64 বিট প্রসেসরের 8 বাইট সীমানায় সংযুক্ত ডেটা সাধারণত একক ক্রিয়ায় লোড হবে এবং সংরক্ষণ করা হবে। ডেটা যা ছোট সীমানায় সংযুক্ত থাকে সেটি লোড বা সঞ্চয় করতে একাধিক ক্রিয়াকলাপ গ্রহণ করবে। এটি ধীর।
SmacL

35

আমি যদি সম্ভব হয় তবে #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জোড়া দিয়ে ঘিরে রাখতে হবে । না সুন্দর.


3
সুতরাং আমি যদি এমএসভিসিতে জিসিসি কোডটি সংকলন করতে চাই এবং কাঠামোগুলিটি প্যাক করা দরকার তবে আমি এটি কীভাবে করব?
SmacL

2
struct __attribute__((__packed__)) PackedStructure
জিসিসির

#pragma একবার বাস্তবসম্মতভাবে "সংকলক নির্ভরশীল এবং অ-বহনযোগ্য" নয়। এটা তোলে প্রতিটি বৃহত প্ল্যাটফর্ম এবং অনেক না প্রধান প্ল্যাটফর্মের .. সমর্থিত হচ্ছে en.wikipedia.org/wiki/Pragma_once#Portability
xaxxon

1
নোট করুন যে C99 এবং C11 উভয়টিতে (C11) .6.10.6 প্রাগমা নির্দেশিকা এবং ¶1 এরূপ কোনও প্রগমা যা প্রয়োগ দ্বারা স্বীকৃত নয় তা উপেক্ষা করা হয়। এমনকি সি 90 এটি বলছে, যদিও এটি §6.8.6 বিভাগে ছিল। (এটি জিসিসিকে অ-অনুগত করে তোলে যদি এটি hackপ্রগমার মুখোমুখি হয় তবে এটি চেনা যায় না, যেহেতু এটি অনেক আগে খুব বেশিদিন আগে করত - দেখুন #pragmaএবং জিসিসি ইত্যাদি)
জোনাথন লেফলার

15

ফেলে #pragma onceআপনার হেডার ফাইল উপরের নিশ্চিত করবে যে এটা শুধুমাত্র একবার অন্তর্ভুক্ত করা হয়। নোট যেটি #pragma onceস্ট্যান্ডার্ড সি 99 নয়, তবে বেশিরভাগ আধুনিক সংকলক দ্বারা সমর্থিত।

বিকল্প হিসাবে রক্ষীদের অন্তর্ভুক্ত ব্যবহার করা হয় (উদাঃ #ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */)


7

আমি যা অনুভব করি তা #pragmaহ'ল একটি নির্দেশনা যেখানে আপনি যদি কোডটি নির্দিষ্ট করে নির্দিষ্ট করতে চান। আপনি যদি এমন একটি পরিস্থিতি বলুন যেখানে আপনি আইএসআর লেখা আছে সেই নির্দিষ্ট ঠিকানা থেকে প্রোগ্রামের কাউন্টারটি পড়তে চান তবে আপনি সেই স্থানে আইএসআর নির্দিষ্ট করতে পারেন #pragma vector=ADC12_VECTORএবং অনুসরণ করে অনুসরণ করতে পারেন নাম এবং এর বিবরণে বাধা দেয়


5

আমার সেরা পরামর্শটি হ'ল আপনার সংকলকের ডকুমেন্টেশনগুলি দেখুন, কারণ প্রগমাস সংজ্ঞা বাস্তবায়ন-দ্বারা নির্দিষ্ট। উদাহরণস্বরূপ, এম্বেড থাকা প্রকল্পগুলিতে আমি তাদের ব্যবহার করেছি বিভিন্ন বিভাগে কোড এবং ডেটা সনাক্ত করতে, বা বিঘ্নিত হ্যান্ডলারগুলি ঘোষণা করতে। অর্থাৎ,

#pragma code BANK1
#pragma data BANK2

#pragma INT3 TimerHandler

3
সমস্ত প্রগমাস বাস্তবায়ন-নির্দিষ্ট - # প্রগমা এসটিডিসি ছাড়া ... প্রাগমাসগুলি, যা সমস্ত প্ল্যাটফর্ম জুড়ে মানক করা হয়েছে (সি 99 ছাড়াও)।
জোনাথন লেফলার

4

উপরের সমস্ত উত্তরগুলির জন্য ভাল ব্যাখ্যা দেয় #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


3

এটি একটি প্রিপ্রসেসর নির্দেশিকা যা নির্দিষ্ট বৈশিষ্ট্যগুলি চালু বা বন্ধ করতে ব্যবহার করা যেতে পারে।

এটি দুই ধরণের #pragma startup, #pragma exitএবং #pragma warn

#pragma startup আমাদের প্রোগ্রাম স্টার্টআপ ডাকা ফাংশন নির্দিষ্ট করতে অনুমতি দেয়।

#pragma exit আমাদের প্রোগ্রাম প্রস্থান করার জন্য ডাকা ফাংশন নির্দিষ্ট করতে দেয়।

#pragma warn কম্পিউটারকে বলে যে কোনও সতর্কতা দমন করতে হবে না।

সংকলকটি #pragmaনিয়ন্ত্রণ করতে আরও অনেক স্টাইল ব্যবহার করা যেতে পারে।


3

#pragma startup একটি নির্দেশ যা মূল ফাংশনের আগে একটি ফাংশন কল করতে এবং মূল ফাংশনের পরে অন্য ফাংশনটি কল করতে ব্যবহৃত হয়, যেমন

#pragma startup func1
#pragma exit func2

এখানে, func1আগে চালানো mainএবং func2পরে চালানো।

দ্রষ্টব্য: এই কোডটি কেবল টার্বো-সি সংকলকটিতে কাজ করে। জিসিসিতে এই কার্যকারিতাটি অর্জন করতে, আপনি এটি ঘোষণা করতে func1এবং এটি func2পছন্দ করতে পারেন :

void __attribute__((constructor)) func1();
void __attribute__((destructor)) func2();

2

এটি সংক্ষেপে, #pragmaসংকলককে স্টাফ করতে বলে। আমি এটি ব্যবহার করার কয়েকটি উপায় এখানে দিচ্ছি:

  • #pragmaসংকলক সতর্কতা উপেক্ষা করতে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, অন্তর্নিহিত ফাংশন ঘোষণার বিষয়ে জিসিসি শাট আপ করতে আপনি লিখতে পারেন:

    #pragma GCC diagnostic ignored "-Wimplicit-function-declaration"

    একটি পুরানো সংস্করণ libportableএটি বহন করে

  • #pragma once, যখন একটি শিরোলেখ ফাইলের শীর্ষে লেখা হয়, তখন বলে যে শিরোনাম ফাইলটি একবার অন্তর্ভুক্ত করা হবে। প্রগমা জন্য একবার libportable চেক সমর্থন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.