ম্যাক্রো সংজ্ঞায়িত মধ্যে প্রগমা


100

অন্যান্য বিবৃতি সহ ম্যাক্রোতে প্রগমা বিবৃতি এম্বেড করার কোনও উপায় আছে?

আমি এরকম কিছু অর্জন করার চেষ্টা করছি:

#define DEFINE_DELETE_OBJECT(type)                      \
    void delete_ ## type_(int handle);                  \
    void delete_ ## type(int handle);                                                \
    #pragma weak delete_ ## type_ = delete_ ## type

আমি যদি উপস্থিত থাকে তবে বুস্ট সলিউশন (তরঙ্গের জন্য সংরক্ষণ করুন) সহ আমি ঠিক আছি।


4
তাত্ক্ষণিকভাবে এটি উভয়ই নয় - # পরীক্ষাগুলি সি বা সি ++ মানদণ্ডের দ্বারা নির্ধারিত হয় না।

প্রিপ্রোসেসরটি হ'ল, সুনির্দিষ্ট অনুমোদিত সাবকম্যান্ডটি চালাতে চাইলেও তা নয়।
পপি

@ ডেডএমজি: সি এবং সি ++ এর মধ্যে প্রচলিত অনেকগুলি বিষয় রয়েছে। প্রিপ্রোসেসিং বেশিরভাগ ক্ষেত্রে সাধারণ, কোন ভাষার মান ব্যবহৃত হচ্ছে তার উপর নির্ভর করে প্রিপ্রোসেসিং কীভাবে নির্দিষ্ট করা হয় তার মধ্যে বড় পার্থক্য রয়েছে (C89, C99, C ++, এবং C ++ 0x FCD)।
জেমস ম্যাকনেলিস

4
@ জেমস ম্যাকনেলিস: কেবলমাত্র প্রযুক্তিগতভাবে, বেশিরভাগ সি প্রোগ্রামগুলি সি ++ এর কাছে বহনযোগ্য, এটি যথাযথভাবে সাধারণ কার্যকারিতা তৈরি করে না, যেহেতু কোনও সি ++ প্রোগ্রামার এটির বেশিরভাগ অংশই করতে পারে না। দুটি ভাষার আসলে খুব একটা মিল নেই।
কুকুরছানা

উত্তর:


116

আপনি যদি c99 বা c ++ 0x ব্যবহার করেন তবে সেখানে প্রগমা অপারেটর রয়েছে as

_Pragma("argument")

যা সমান

#pragma argument

এটি ম্যাক্রোগুলিতে ব্যবহার করা যায় (সি 99 স্ট্যান্ডারের অংশ 6.10.9, বা সি ++ 0 এক্স চূড়ান্ত কমিটির খসড়াটির 16.9 দেখুন)

উদাহরণ স্বরূপ,

#define STRINGIFY(a) #a
#define DEFINE_DELETE_OBJECT(type)                      \
    void delete_ ## type ## _(int handle);                  \
    void delete_ ## type(int handle);                   \
    _Pragma( STRINGIFY( weak delete_ ## type ## _ = delete_ ## type) )
DEFINE_DELETE_OBJECT(foo);

যখন পুরা gcc -Eদেয়

void delete_foo_(int handle); void delete_foo(int handle);
#pragma weak delete_foo_ = delete_foo
 ;

32
এফওয়াইআই হিসাবে: এমএসভিসির প্রিপ্রোসেসর __pragma()অপারেটর রয়েছে, যা দুর্ভাগ্যক্রমে সি 99 এর _Pragma()অপারেটর থেকে কিছুটা আলাদা (সি 99 এর স্ট্রিং আক্ষরিক লাগে, এমএসভিসি'র টোকেনগুলি স্ট্রিংতে নেই): এমএসডিএন.মাইক্রোসফটকম
মাইকেল বুড়

15
@ মিশেলবুর এমএসভিসি সর্বদা আলাদা হতে হবে, তাই না?
টমাস

5

একটি দুর্দান্ত জিনিস যা আপনি_প্রগ্রাম ("যুক্তি") এর সাথে করতে পারেন তা হ'ল কিছু সংকলক সম্পর্কিত সমস্যাগুলি যেমন ডিল করার জন্য এটি ব্যবহার করা হয়

#ifdef _MSC_VER
#define DUMMY_PRAGMA _Pragma("argument")
#else
#define DUMMY_PRAGMA _Pragma("alt argument")
#endif

0

না, এটি করার কোনও পোর্টেবল উপায় নেই। তারপরে আবার # প্রাগমা ব্যবহার করার মতো কোনও পোর্টেবল উপায় নেই। এ কারণে, অনেক সি / সি ++ সংকলক প্রগমা জাতীয় জিনিসগুলি করার জন্য তাদের নিজস্ব পদ্ধতিগুলি সংজ্ঞায়িত করে এবং তারা প্রায়শই ম্যাক্রোগুলিতে এম্বেড করা যেতে পারে তবে প্রতিটি সংকলকটিতে আপনার আলাদা ম্যাক্রো সংজ্ঞা প্রয়োজন। আপনি যদি সেই পথে যেতে ইচ্ছুক হন তবে আপনি প্রায়শই এই জাতীয় জিনিসগুলি শেষ করেন:

#if defined(COMPILER_GCC)
#define Weak_b
#define Weak_e __attribute__((weak))
#elif defined(COMPILER_FOO)
#define Weak_b __Is_Weak
#define Weak_e
#endif

#define DEFINE_DELETE_OBJECT(type)                      \
    Weak_b void delete_ ## type_(int handle) Weak_e;    \
    Weak_b void delete_ ## type(int handle)  Weak_e;    

যদি আপনি এটি সংজ্ঞায়িত করতে চান Weak_bএবং Weak_eশুরুতে এবং শেষের মতো বন্ধনী নির্মান করতে চান তবে জিসিসির মতো কিছু সংকলক একটি ধরণের স্বাক্ষরের সাথে সংযোজন হিসাবে বৈশিষ্ট্যগুলি যুক্ত করে এবং কিছু এমএসসির মতো এটি উপসর্গ হিসাবে যুক্ত করে (বা কমপক্ষে এটি করেছিল) একবার, আমি এমএসসি ব্যবহার করেছি এর বহু বছর পরে)। বন্ধনী সংক্রান্ত চুক্তিগুলি আপনাকে এমন কিছু সংজ্ঞা দিতে দেয় যা সর্বদা কাজ করে, এমনকি যদি আপনাকে একটি সংকলক নির্মাণে পুরো টাইপের স্বাক্ষরটি পাস করতে হয় তবে।

অবশ্যই, আপনি যদি চান এমন গুণাবলী ছাড়াই এটি একটি সংকলকটিতে পোর্ট করার চেষ্টা করেন, তবে ম্যাক্রোগুলিকে কিছুতেই প্রসারিত করতে পারেন এবং আপনার কোডটি এখনও চালিত হবে আশা করে আপনি কিছুই করতে পারবেন না। খাঁটি সতর্কতা বা প্রগমগুলি অনুকূল করার ক্ষেত্রে এটি সম্ভবত। অন্যান্য ক্ষেত্রে, খুব বেশি না।

ওহ, এবং আমি সন্দেহ করি যে আপনার অবশ্যই Weak_b এবং Weak_e কে ম্যাক্রো হিসাবে প্যারামিটারগুলি সংজ্ঞায়িত করতে হবে, তবে কীভাবে এই উদাহরণটির জন্য একটি দুর্বল সংজ্ঞা তৈরি করা যায় তার জন্য আমি ডক্সের মাধ্যমে পড়তে রাজি ছিল না। আমি পাঠকের জন্য অনুশীলন হিসাবে ছেড়ে।


-3

অন্যান্য বিবৃতি সহ ম্যাক্রোতে প্রগমা বিবৃতি এম্বেড করার কোনও উপায় আছে?

না, আপনি প্রিপ্রসেসর স্টেটমেন্টগুলিতে প্রিপ্রসেসর স্টেটমেন্ট রাখতে পারবেন না। আপনি তবে এটি কোনও inlineকার্যক্রমে রাখতে পারেন। Cযদিও ট্যাগটিকে পরাস্ত করে ।


4
একটি ইনলাইন ফাংশন এটি করা ভাল কি? প্রাক-প্রসেসরের নির্দেশাবলী কোনও ফাংশনকে স্বীকৃতি দিতে পারে তার আগে প্রক্রিয়া করা হয়।

4
সি 99 রয়েছে inlineএবং সর্বাধিক বড় সি 98 বাস্তবায়নের কিছুটা ভিন্নতা রয়েছে।
ক্রিস লুটজ

@ ক্রিস অনুমান করে আপনার মন্তব্যটি আমার দিকে পরিচালিত হয়েছিল - আপনার বক্তব্যটি - কী?

@ নীল - না, দুঃখিত। আমি @ এসবিআইয়ের শেষ বাক্যে এটি পরিচালনা করছিলাম।
ক্রিস লুটজ

4
@ ক্রিস: আহ, তাই inlineসি ++ থেকে আরও একটি জিনিস ধার করা হয়েছে! :)
এসবিআই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.