স্ট্রাক ইনিশিয়ালাইজারটিতে বিন্দু (।) এর অর্থ কী?


117
static struct fuse_oprations hello_oper = {
  .getattr = hello_getattr,
  .readdir = hello_readdir,
  .open    = hello_open,
  .read    = hello_read,
};

আমি এই সি সিনট্যাক্সটি ভাল করে বুঝতে পারছি না। আমি এমনকি অনুসন্ধান করতে পারি না কারণ আমি সিনট্যাক্সের নাম জানি না। ওটা কী?


এটি স্ট্রাক্ট ইনিশিয়ালাইজারের মতো দেখাচ্ছে।
রহস্যময়

7
C99 এ স্ট্যান্ডার্ডযুক্ত, সুতরাং আপনার যদি কোনও (সত্যই) পুরানো সংকলক থাকে তবে কাজ করবেন না।
কিছু প্রোগ্রামার ude ই

2
: অবশেষে জন্য এই লিঙ্কে পাওয়া stackoverflow.com/questions/330793/...
Mysticial

5
দুর্ভাগ্যক্রমে, এমনকি এমএসভিসির বর্তমান সংস্করণগুলি এই মান অনুসারে '(সত্যই) পুরানো সংকলক'।
জনাথন লেফলার

একেবারে উদ্ভট, আমি একটি ফিউজ টিউটোরিয়াল দিয়ে যাওয়ার সময় এবং এই একই একই ইনিশিয়ালাইজারটি লিখতে গিয়ে এই প্রশ্নটি অনুসন্ধান করেছিলাম।
কেগান জে

উত্তর:


141

এটি একটি সি 99 বৈশিষ্ট্য যা আপনাকে প্রাথমিকের নামে কাঠামোর নির্দিষ্ট ক্ষেত্রগুলি সেট করতে দেয় allows এর আগে, আরম্ভকারীকে সমস্ত ক্ষেত্রের জন্য কেবলমাত্র মানগুলি অন্তর্ভুক্ত করা দরকার - যাতে এখনও কাজ করে অবশ্যই।

সুতরাং নিম্নলিখিত কাঠামোর জন্য:

struct demo_s {
  int     first;
  int     second;
  int     third;
};

...তুমি ব্যবহার করতে পার

struct demo_s demo = { 1, 2, 3 };

... অথবা:

struct demo_s demo = { .first = 1, .second = 2, .third = 3 };

...অথবা এমনকি:

struct demo_s demo = { .first = 1, .third = 3, .second = 2 };

... যদিও শেষ দুটি কেবল সি 99 এর জন্য।


সিট ++ এও কি ডট ইনিশিয়ালাইজেশন কাজ করে? (আমার এটি পরীক্ষা করে নেওয়া দরকার)
গ্যাব্রিয়েল স্ট্যাপলস

1
এটি প্রদর্শিত হয়, এটি কেবলমাত্র ডকুমেন্টেশনটির দিকে চেয়ে কেবল সি ++ ২০ এর জন্য রয়েছে। সি এর জন্য সিপ্রেফারেন্স.কম ডকুমেন্টেশন এখানে রয়েছে (সি 99 এর পরে থেকে কাজ করে): en.cppreferences.com/w/c/language/struct_initialization , এবং সি ++ (কেবলমাত্র সি ++ 20 এর জন্য কাজ করে): en.cppreferences.com/w/cpp / ভাষা / সমষ্টি_নীতিমালা
গ্যাব্রিয়েল স্টেপলস

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

ডট ইনিশিয়ালাইজেশনে একটি সম্ভাব্য গোটচা রয়েছে (কমপক্ষে কয়েকটি সংকলক সহ)। struct demo_s demo = { .first = 1, .first = 9 };আমার জিসিসি এক তারিখে আপনার এই সতর্কবাণী ছাড়াই কম্পাইল হবে এবং প্রথম 9. হতে হবে
Renate


15

এটি designated initialisation( মনোনীত প্রারম্ভিক দেখুন ) হিসাবে পরিচিত । একটি "আরম্ভকারী-তালিকা", প্রতিটি ' .' একটি " designator" যা এই ক্ষেত্রে fuse_oprations' hello_oper' আইডেন্টিফায়ার দ্বারা নির্ধারিত বস্তুর জন্য আরম্ভ করার জন্য ' ' কাঠামোর নির্দিষ্ট সদস্যকে নাম দেয় ।


0

পুরো সিনট্যাক্সটি মনোনীত ইনিশিয়ালাইজার হিসাবে পরিচিত যা ইতিমধ্যে COD3BOY দ্বারা উল্লিখিত হয়েছে এবং এটি সাধারণভাবে ব্যবহৃত হয় যখন আপনাকে কিছু নির্দিষ্ট বা ডিফল্ট মানগুলি ঘোষণার সময় আপনার কাঠামোটি আরম্ভ করার প্রয়োজন হয়।

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