এটা কি (( ))?


90

জিসিসি সংকলক উত্স কোড (জিসিসি / সি-পরিবার / সি-প্রাগমা.সি) এর মাধ্যমে ব্রাউজ করার সময় আমি দেখতে পেয়েছি:

typedef struct GTY(()) align_stack {
  int                  alignment;
  tree                 id;
  struct align_stack * prev;
} align_stack;

এবং আমার পিছনে প্রচুর সি প্রোগ্রামিং বছর নির্বিশেষে, এই বিটগুলি: (())এখনও আমার কাছে সম্পূর্ণ অজানা। কেউ দয়া করে তাদের বোঝাতে পারেন? গুগল এটি সন্ধান করবে বলে মনে হয় না।


আর এ কী GTY? এটি ভাষার মান হিসাবে সংজ্ঞায়িত করা হয় না। আপনার কোড দেখুন।
আলেক্সি ফ্রুঞ্জ

7
জিটিওয়াই কি ম্যাক্রো ???
আনশুল

4
আপনি গুগলে কোয়েরি স্ট্রিংয়ে সাইটটি নির্দিষ্ট করে গুগলে এটি সন্ধান করতে পারেন:GTY site:gcc.gnu.org
এরিকসন

উত্তর:


81

এগুলি হ'ল জিসিসির অভ্যন্তরীণ "যাদু", অর্থাত্ সংকলক বাস্তবায়নের অংশ।

এই পৃষ্ঠাটি দেখুন যা তাদের ব্যবহার সম্পর্কে আলোচনা করে। ম্যাক্রো আবর্জনা সংগ্রহের উদ্দেশ্যে চিহ্নিত করতে ব্যবহৃত হয়। যুক্তিও থাকতে পারে, এই পৃষ্ঠাটি দেখুন বিশদ জন্য দেখুন।

আপডেট :: ड्रু ডোরম্যান একটি মন্তব্যে যেমন উল্লেখ করেছেন , প্রকৃত ডাবল প্রথম বন্ধনীগুলি জিএনইউ বাস্তবায়নের "অভ্যন্তরীণতার" অংশ নয়; আপনি ম্যাক্রো নামক একক যুক্তিতে আর্গুমেন্টের সম্পূর্ণ তালিকা সংগ্রহ করতে চাইলে এগুলি সাধারণত ব্যবহৃত হয়। উদাহরণস্বরূপ printf(), মোড়ানোর সময় কখনও কখনও এটি কার্যকর হতে পারে । এই কৌশলটি আরও জানতে এই প্রশ্নটি দেখুন


4
লিখিত সাইটে @ কৃষ্ণভদ্রের ব্যাখ্যা পাওয়া যাবে। জিটিওয়াই-মার্কার ইমো সম্পর্কিত জিসিসি বৈশিষ্ট্যগুলি সম্পর্কে আরও ব্যাখ্যা এই নির্দিষ্ট প্রশ্নোত্তরের বাইরে নয়।
আরনে মের্টজ

30
(())নিজেই না জিসিসি জাদু। এটি এমন একটি পাঠ্যকে অনুমতি দেয় যা একক যুক্তি হিসাবে ম্যাক্রোতে কমা যুক্ত করে passed যে কোনও সি / সি ++ কম্পাইলারের জন্য।
ড্রু ডোরম্যান

45

সাধারণভাবে, কমাগুলি রক্ষার জন্য এটি ম্যাক্রোগুলির সাথে ব্যবহৃত হয়। দেওয়া হয়েছে #define foo(a,b), ম্যাক্রো অনুরোধটি foo(1,2,3)অবৈধ হবে। অতিরিক্ত যুগল বন্ধনী ব্যবহার করে স্পষ্ট করে যে কোন কমাটি রক্ষা করা হয়েছে: foo((1,2),3)বনামfoo(1,(2,3))

এই ক্ষেত্রে, GTYকমা একাধিক আর্গুমেন্ট নিতে পারে, কমা দ্বারা আলাদা করে, তবে এই সমস্ত কমা অবশ্যই রক্ষা করা উচিত। এই কারণেই অভ্যন্তরীণ ()সমস্ত তর্ককে ঘিরে।


4
কারও কাছে কেন এমন কল ব্যবহার করা উচিত তা আপনি ব্যাখ্যা করতে পারেন?
সোয়েচটার

4
উদাহরণস্বরূপ #define PRINT_A_LOT(a,b) printf("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");(সি ++ তে অবশ্যই ম্যাক্রোর চেয়ে ভাল সমাধান রয়েছে)।
এমসাল্টার

@ অ্যালবার্টাস: আপনি ম্যাক্রোতে টেমপ্লেটগুলি পাস করলে এটিও দুর্দান্ত হবে Macro((Pair<int, int>), ...)। তবুও আপনি অতিরিক্ত সমস্যায় পড়ে, ম্যাক্রোর মধ্যে প্রথম বন্ধনী থেকে মুক্তি
পেয়েছেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.