বাইরে থেকে কোনও ফাংশন অ্যাক্সেস করা হচ্ছে তা কীভাবে স্পষ্ট করবেন?


9

এটি একটি সি নির্দিষ্ট প্রশ্ন। আমি অনুবাদ ইউনিটের সীমার ভিতরে সম্ভব সমস্ত কিছু রাখার চেষ্টা করছি, কেবলমাত্র কিছু ফাংশন .hফাইলের মাধ্যমে প্রকাশ করছি । তা হচ্ছে, আমি staticফাইল-স্তরের অবজেক্টগুলিকে লিঙ্কেজ দিচ্ছি ।

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

সুতরাং আমি ভাবছি কীভাবে এটি খুব স্পষ্ট করে তুলবেন যে এই ফাংশনগুলি কিছু অস্পষ্ট অবস্থান থেকে ডাকা হয়েছিল।

  • তাদের হওয়া উচিত ( staticবা externএগুলিতে প্রকাশ করা .h)?
  • ফাংশনগুলির নামে আমার কিছু ইঙ্গিত অন্তর্ভুক্ত করা উচিত?
  • অথবা "এক্স দ্বারা ডাকা" একটি মন্তব্য করা কি যথেষ্ট?

1
এটি একটি দুর্দান্ত প্রশ্ন। আমার সমাধান (যার সাথে আমি মোটেও খুশি নই, এই কারণেই আমি এটিকে কেবল একটি মন্তব্যে রাখছি) হ'ল সংক্ষিপ্তরূপে নামকরণ করা এবং আমি যে সুযোগ পেতে চাই তাতে গ্রুপিং ফাংশনগুলি একাধিক হেডার ফাইল তৈরি করা। আষ্টার লাইব্রেরির জন্য আমি তৈরি করেছি আষ্টার.হ, অষ্টার_প্রাইভেট.হ, অষ্টার_প্যাকেজ প্রাইভেট.এইচ ... ইত্যাদি ...
ড্রাগন

উত্তর:


2

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

যেহেতু সিআই এর প্রতিটি বাস্তবায়নের যোগসূত্রটি প্রতীকী, সেহেতু যে কোনও ক্রিয়াকলাপ ডেকে আনতে হবে তার প্রতীকটি অবশ্যই উল্লেখ করা উচিত:

foo();  /* Direct */

some_function_pointer_t funcs[] = { &foo, &bar, &baz };  /* Indirect */

যদি আপনি ভুল করে বলে ঘোষণা foo()করেন তবে staticআপনার প্রোগ্রামটি লিঙ্ক করবে না। যদি আপনি এটি অ-ঘোষণা করে থাকেন তবে staticআপনার কাছে একটি বহিঃপ্রকাশ ফাংশন রয়েছে যা বলা হয় না। কোনও ফাংশন ব্যবহৃত হয়েছে কিনা তা সম্পর্কে প্রশ্নগুলি আপনার অবজেক্ট ফাইলগুলির প্রতীক টেবিলগুলি ডাম্প করে বা উত্সগুলিতে অনুসন্ধান করে সমাধান করা যেতে পারে।


1

সুতরাং আমি কীভাবে এটি খুব স্পষ্ট করতে পারি যে এই ফাংশনগুলি কিছু অস্পষ্ট অবস্থান থেকে ডাকা হয়েছিল।

"অস্পষ্ট" সংজ্ঞা দিন।
পদ্ধতিগুলি সুস্পষ্টভাবে সংজ্ঞায়িত "ইন্টারফেস" এর মাধ্যমে প্রকাশ করা উচিত এবং শিবান ড্রাগন ইতিমধ্যে পরামর্শ দিয়েছিল, সেই "ইন্টারফেস" আপনার .h ফাইল are আপনি যদি অন্য প্রোগ্রামটিকে "ডান" শিরোনাম ফাইলটি না দেন তবে এটি পদ্ধতিটি কল করতে পারে না।

এগুলি কি স্থির বা বহিরাগত হওয়া উচিত (এবং তাদেরকে .h মধ্যে প্রকাশ করুন)?

static পারে , যাতে যতদিন আপনি কোন ক্লাস আছে না [-একটি নির্মান] যে উদাহরণস্বরূপ ডাটা থাকতে ঠিক।
externএর অর্থ আপনি আসলে এটিকে বাস্তবায়ন করেন না; সংযোগ প্রক্রিয়া চলাকালীন একটি বাস্তবায়ন অন্য কোথাও থেকে "অর্জিত" হয়।

ফাংশনগুলির নামে আমার কিছু ইঙ্গিত অন্তর্ভুক্ত করা উচিত?

অথবা "এক্স দ্বারা ডাকা" একটি মন্তব্য করা কি যথেষ্ট?

একেবারে না.

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


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

1
দ্বিতীয় বিষয়টির সাথে সম্পর্কিত, আমার বোধগম্যতা অবধি, অবজেক্ট, ফাইল স্কোপে সংজ্ঞায়িত ডিফল্টরূপে বাহ্যিক সংযোগ রয়েছে; অতএব externশব্দ redundant` হয়
ভোরাক

0

যদি কলব্যাক ফাংশনগুলি আপনার মডিউলটির মধ্যে সংজ্ঞায়িত করা হয় এবং ব্যবহারকারী কখনও তার নিজস্ব কোনও সরবরাহ করে না, আমি মনে করি আপনি আরম্ভের পর্যায়ে কোনও স্থানধারক ব্যবহার করতে পারেন। স্থানধারক সাধারণত একটি enumযা অভ্যন্তরীণভাবে সঠিক staticফাংশনে অনুবাদ করা হয় ।


0

আমি এখনও তাদের তৈরি করব static(এগুলি কেবলমাত্র কারও সাথে সংযুক্ত এবং কল করার উদ্দেশ্যে নয়) এবং তাদের উদ্দেশ্যটি তাদের নামে বাহ্যিক কার্যগুলিতে সরবরাহিত কলব্যাক হিসাবে চিহ্নিত করব।

static কারণ আমি যা আড়াল করতে পারি তা লুকানোর চেষ্টা করি, যতটুকু আমি এটি আড়াল করতে পারি।

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


0

স্কোপ মডিফায়ারগুলি প্রাথমিকভাবে সংকলক হিসাবে তথ্য হিসাবে ব্যবহার করা উচিত, "যথেষ্ট পর্যাপ্ত" ডকুমেন্টেশনের ফর্ম হিসাবে নয়। staticবিশেষত ব্যবহারটি একটি সি সংকলককে মডিউলটির বাইরে থেকে কলব্যাক হিসাবে অকার্যকর করার জন্য অনুমতি দেয় - আপনি যা চান তা নয়, যদিও এটি আপনার বর্তমান সংকলকটির সাথে কাজ করতে পারে।

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

সুতরাং, কেবলমাত্র বিকল্পটি ফাংশনটির নামকরণ করা এটি কলব্যাক indicate বেশিরভাগ উদাহরণ আমি ব্যবহার _callbackবা _cbপ্রত্যয় cb_হিসাবে বা উপসর্গ হিসাবে দেখেছি । যদি আপনার কোডগুলিতে কলব্যাকগুলি অস্বাভাবিক হয় তবে লম্বা ফর্মটি ব্যবহার করুন, সংক্ষিপ্ত ফর্মটি যদি সাধারণ হয়।

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