স্ট্রাক্টসের অ্যারে শেষে ফাঁকা ধনুর্বন্ধনী '{?' দরকার কী?


59

আমি লিনাক্স কার্নেলে কিছু কোড মারি:

static struct ctl_table ip_ct_sysctl_table[] = {
    {
        .procname   = "ip_conntrack_max",
        .maxlen     = sizeof(int),
        .mode       = 0644,
        .proc_handler   = proc_dointvec,
    },
    // ...
    {
        .procname   = "ip_conntrack_log_invalid",
        .maxlen     = sizeof(unsigned int),
        .mode       = 0644,
        .proc_handler   = proc_dointvec_minmax,
        .extra1     = &log_invalid_proto_min,
        .extra2     = &log_invalid_proto_max,
    },
    { }
};

এখানে স্ট্রাইকগুলির একটি অ্যারে শেষ হয় { }। এটি কী উদ্দেশ্যে যুক্ত করা হয়েছিল?
যাইহোক, এই কোডের কিছুটা উপরে স্ট্রাক্টগুলির আরেকটি অ্যারে রয়েছে তবে শেষে খালি ধনুর্বন্ধনী ছাড়াই।

স্ট্রাক্টগুলির অ্যারের শেষে কখন খালি বন্ধনী ব্যবহার করা উচিত?


1
হুম কী যদি এটি অ্যারের সমাপ্তির সাথে 0 টি সংকেত যুক্ত করে স্ট্রিংটির সমাপ্তি করে? শুধু মনন.
এরাকলন

4
এটি কিছু অ-মানক জিসিসি এক্সটেনশন। এবং এর মতো, এটি সম্ভবত খুব কম বা কোনও নথিপত্র নিয়ে আসে ... আমি কেবল সমস্ত দস্তাবেজ পড়েছি এবং খালি স্ট্রাক্ট আরম্ভকারী তালিকা সম্পর্কে আমি কিছুই খুঁজে পাচ্ছি না। তবুও এটি সংকলন করে, যদি না আপনি কঠোর আইএসও প্রয়োগ করেন -pedantic
লুন্ডিন

9
যাইহোক, এটি একটি "সেন্ডিনেল" মান, অ্যারের সমাপ্তি চিহ্নিত করতে শূন্য / এনএলএল সেট করে সবকিছু সহ একটি আইটেম।
লন্ডিন

উত্তর:


38

এই বিশেষ পরিবর্তন অংশ ছিল sysctl নেট: অব্যবহৃত বাইনারি sysctl কোডটি সরাতে এরিক ডব্লিউ Biederman দ্বারা কমিট, শেষ উপাদান আরম্ভের পরিবর্তন ip_ct_sysctl_tableথেকে অ্যারের {0}করতে{} (এবং অনেক অন্যান্য অ্যারে initializations অনুরূপ পরিবর্তন সঞ্চালিত)।

{0}প্যাটার্ন অনেক লম্বা যদিও জন্য প্রায় হয়েছে বলে মনে হয়, এবং উভয় {0}বা {}চূড়ান্ত উপাদান-আরম্ভের সাধারণভাবে হয় (লিনাক্সের সোর্স কোডে) স্পষ্টভাবে হিসাবে উল্লেখ করা Terminating entry, তাই এটি সম্ভবত তাদের লেন্থ জেনে এই অ্যারে গ্রাসকারী করার অনুমতি একটি প্যাটার্ন উপস্থিত থাকলে, শূন্য-আরম্ভকৃত টার্মিনেটিং এন্ট্রি মারার সময় ব্যবহারের সমাপ্তি। যেমন sound/aoa/fabrics/snd-aoa-fabric-layout.cশূন্য-সূচনাকরণের উদ্দেশ্যে একই ধরণের অ্যারেগুলির জন্য এমনকি একটি মন্তব্যেও স্পষ্টভাবে উল্লেখ করা হয়েছে, যেমন:

static struct codec_connection toonie_connections[] = {
  {
      .connected = CC_SPEAKERS | CC_HEADPHONE,
      .codec_bit = 0,
  },
  {} /* terminate array by .connected == 0 */
};

11
কার্যকারিতার দিক থেকে 100% সমতুল্য একটি জিসিসি এক্সটেনশানের পক্ষে স্ট্যান্ডার্ড সি ছাড়ার পক্ষে তাদের যুক্তিটি জেনে রাখা আকর্ষণীয় হবে। এটি যা করে তা হ'ল স্ট্যান্ডার্ড সি সংকলকগুলিকে সংকলন করা থেকে রোধ করা। অর্থাৎ কল্পনানুসারে 100% সমতুল্য কারণ জিসিসি এই বৈশিষ্ট্যটি নথি বলে মনে হচ্ছে না ... এই হল না , একটি শূন্য দৈর্ঘ্যের অ্যারের এটি একটি খালি সূচনাকারী তালিকা।
লুন্ডিন

@ লন্ডিন চাইবে না int arr[] = {}(আমরা জিএনইউ খালি আরম্ভকারী এক্সটেনশানটি ব্যবহার করছি) এর ফলে খালি অ্যারে হয়; অর্থাত, মাপ arrহচ্ছে 0?
dfri

1
@ লন্ডিন: cppreferences পৃষ্ঠাটি আইএসও / আইসিসি 9899: 2011 এর শব্দের সাথে সাংঘর্ষিক, যা এটির জন্য অনুমতি দেয় (.7§..9.৯ (২১))। কোনও আরম্ভকারীগণ নিঃসন্দেহে সমষ্টিগুলির সদস্যদের চেয়ে "কম" নয়। সুতরাং এটি কোনও তাত্পর্য সংকলক এক্সটেনশান নয়, বৈধ সি
ড্যামন

2
@ ড্যামন এটি বৈধ সি নয় এবং এটি সুপরিচিত ... জিসিসি-বিভক্ত-ত্রুটি সহ সংকলন করুন। কেন তা বোঝার জন্য, আপনাকে একটি প্রারম্ভিক তালিকার জন্য প্রকৃত সিনট্যাক্সটি পড়তে হবে, 6.7.9 এর শীর্ষে। কমপক্ষে একটি আরম্ভকারী থাকতে হবে। এখানে ব্যাখ্যা করা হয়েছে: স্ট্যাকওভারফ্লো . com / জিজ্ঞাসা / 17589533/… । বিশেষত { initializer-list }তারপরে আরম্ভকারী তালিকা: designation(opt) initializerবাinitializer-list , designation(opt) initializer
লন্ডিন

2
@ লন্ডিন এই নির্দিষ্ট ক্ষেত্রে, কোনও ধারণা নেই। তবে জিসিসি এক্সটেনশানগুলি লিনাক্স কার্নেলে ব্যাপকভাবে ব্যবহৃত হয়।
ববসবার্নার 13

20

আপনি সম্ভবত শূন্য-সমাপ্ত স্ট্রিংগুলির সাথে পরিচিত। ctl_table ip_ct_sysctl_table[]একটি শূন্য-সমাপ্ত অ্যারে, অর্থাৎ শেষ অ্যারে এন্ট্রিতে সমস্ত শূন্য সদস্য রয়েছে।


1
সুতরাং অ্যারের মধ্য দিয়ে যেতে, আপনি জানেন যে আপনি যখন পৌঁছেছেন যখন procnameনাল হয়, বা maxlenশূন্য হয়।
পল ওগিলভি

1
@ পাওলগিলভি: ঠিক আছে, উদাহরণটি অসম্পূর্ণ। procnameএটি একটি char[100]ক্ষেত্রে হতে পারে এটি ""নাল নয়। তবে অন্যথায় হ্যাঁ
এমসাল্টার্স

13

স্ট্রাক্টসের অ্যারে শেষে ফাঁকা ধনুর্বন্ধনী '{?' দরকার কী?

পরিষ্কার হতে হবে: সি বাক্য গঠন প্রয়োজনীয়তাগুলি পূরণ করতে "খালি ধনুর্বন্ধনী '{}' স্ট্রাক্টসের অ্যারের শেষে" দরকার হয় না ।

স্ট্রাক্টগুলির অ্যারের শেষে কখন খালি বন্ধনী ব্যবহার করা উচিত?

কোড যখন একটি সেন্ডিনেল মান চায় ।

এটা কখনো হয় দরকারী শেষ সনাক্ত করতে অবশ্যই - প্রোগ্রামটিকে সব zeros একটি চূড়ান্ত অ্যারের উপাদান আছে জন্য। প্রয়োজন অ্যারের অ্যাপ্লিকেশনের ব্যবহার থেকে আসে ctl_table ip_ct_sysctl_table[]একটি সি ল্যাঙ্গুয়েজ প্রয়োজন থেকে নয়।


9

অ্যারের শেষে এক শূন্যের প্রাথমিক উপাদানটি যাতে অ্যারের উপাদানগুলির সংখ্যা এক এক করে বাড়িয়ে দেয়।

এই ছোট ডেমো বিবেচনা করুন:

#include <stdio.h>

struct Test
{
  int x;
  int y;
} arr[] =
{
    {1,2},
    {3,4},
//  {}
};

int main(void) {
    printf("%zu\n", sizeof(arr) / sizeof(arr[0]));
    return 0;
}

অ্যারের প্রারম্ভিককরণের তালিকার শেষে arrযদি আপনি কোনও অসুবিধা না {}করেন তবে অ্যারের আকার পরিবর্তন হবে ।

আউটপুট:

সহ // {}(অ্যারেতে 2 টি উপাদান রয়েছে)

2

সহ {}(অ্যারেতে 3 টি উপাদান রয়েছে)

3

অারোও ব্যাখ্যা:

ip_ct_sysctl_tableঅ্যারে শুধুমাত্র এক জায়গায়, এখানে যে ব্যবহার করা হয়:

in->ctl_table = kmemdup(ip_ct_sysctl_table,
                sizeof(ip_ct_sysctl_table),
                GFP_KERNEL);

অতিরিক্ত {}মোট আকার বাড়ে ip_ct_sysctl_table


1
এটি "অ্যারের উপাদানের সংখ্যা বাড়ানোর জন্য নয়" তবে অ্যারের সমাপ্তির সংকেত দেওয়ার জন্য।
পল ওগিলভি

6
তোমার কোন. ধারণাটি হ'ল এ পর্যন্ত কেউই একেবারে নিরঙ্কুশতার সাথে পুরোপুরি ব্যাখ্যা করতে সক্ষম হয়নি। সুনির্দিষ্টতার নিকটতম বক্তব্যটি হ'ল { }এটি একটি আরম্ভকারী। তবে কেন এখনও অস্পষ্ট। সুতরাং, এখন যাহাই হউক না কেন জন্য, শব্দ সম্ভবত সম্ভবত একটি ভাল ধারণা। :)
রাইকার 13
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.