সি ++ এ একটি .inl ফাইলের তাৎপর্য


108

.Inl ফাইলটিতে ঘোষণার সুবিধা কী কী? আমার কখন এটি ব্যবহার করা দরকার?


3
FWIW, আমি .inl ফাইলগুলি ঘৃণা করি। আপনার কোডটি প্রয়োজনের চেয়ে আরও বেশি বিভক্ত করবেন কেন?
শোগ 9

10
@ শোগ 9: প্রয়োগ থেকে ইন্টারফেস পৃথক করা। আমি সবসময় সি # এবং জাভা ফাইলকে ঘৃণা করি কারণ সমস্ত মেসি বাস্তবায়নের বিশদগুলির কারণে ইন্টারফেসটি পড়া এত কঠিন।
মার্টিন ইয়র্ক

8
@ মার্টিন - দুর্ভাগ্যক্রমে সি ++ আমাদের উভয় পৃথিবীর একটি খারাপ সংমিশ্রণ দেয় - ইন্টারফেস এবং শিরোনামে প্রয়োগের অংশ, বাকী .cpp ফাইলে বাস্তবায়ন। এমনকি যদি আপনি ইনলাইন ফাংশনগুলি এড়িয়ে যান (বা এগুলিকে ফাইলগুলিতে রাখেন) তবে আপনি ব্যক্তিগতভাবে সদস্যদের বিব্রতকর বিবরণ সহ ইন্টারফেসটি বিশৃঙ্খল করতে হবে যদি না আপনি ধর্মীয়ভাবে পিম্পল আইডিয়ামটি ব্যবহার করতে সক্ষম না হন।
মাইকেল বুড়

5
হ্যাঁ, আমি যুক্তিটি কখনই বুঝতে পারি নি যে শিরোনামগুলি প্রয়োগকরণ থেকে পৃথক ইন্টারফেস। তারা অবশ্যই না। একটি ইন্টারফেসে সমস্ত ব্যক্তিগত সদস্য থাকা উচিত নয়।
জলফ

@ লকিআস্তারি: ন্যায্য বলতে জাভা / সি # এর ইন্টারফেসের রূপরেখা স্বয়ংক্রিয়ভাবে সরবরাহ করার জন্য খুব ভাল সরঞ্জামাদি রয়েছে। এটি অন্য উপায়ে রাখতে পারে: সি ++ এ আপনাকে ম্যানুয়ালি কোনও সমস্যার সমাধান করতে হবে, যা সম্পূর্ণ কম্পিউটার দ্বারা সমাধান করা যেতে পারে।
bluenote10

উত্তর:


139

.inlফাইলগুলি কখনই বাধ্যতামূলক হয় না এবং সংকলকটির কোনও বিশেষ তাত্পর্য নেই। এটি আপনার কোডকে কাঠামোগত করার একটি উপায় যা এটি পড়তে পারে এমন মানুষকে একটি ইঙ্গিত সরবরাহ করে।

আমি .inlদুটি ক্ষেত্রে ফাইল ব্যবহার করি :

  • ইনলাইন ফাংশন সংজ্ঞা জন্য।
  • ফাংশন টেমপ্লেট সংজ্ঞা জন্য।

উভয় ক্ষেত্রেই, আমি ফাংশন ঘোষণা একটি শিরোলেখ ফাইল যা অন্যান্য ফাইল দ্বারা অন্তর্ভুক্ত করা হয়, তারপরে আমি করা ফাইল হেডার ফাইল নীচে।#include.inl

আমি এটি পছন্দ করি কারণ এটি বাস্তবায়ন থেকে ইন্টারফেসকে পৃথক করে এবং শিরোনাম ফাইলটি পড়ার জন্য কিছুটা সহজ করে। আপনি যদি প্রয়োগের বিশদটি সম্পর্কে যত্নশীল হন তবে আপনি .inlফাইলটি খুলতে এবং এটি পড়তে পারেন। আপনি যদি না করেন, আপনার দরকার নেই।


2
প্রকৃতপক্ষে, এটি বেশিরভাগ ক্ষেত্রে বাস্তবায়ন থেকে ইন্টারফেসকে পৃথক করার বিষয়ে।
পাভেল মিনায়েভ

1
আমি .pp এবং .ixxও ইনলাইন সংজ্ঞা এবং টেমপ্লেটের জন্য .tpp এবং .txx ব্যবহার করেছি।
এপ্রোগ্রামার

1
উদাহরণস্বরূপ, জিএনইউ স্ট্যান্ডার্ড সি ++ লাইব্রেরি .tccটেম্পলেট বাস্তবায়ন ফাইলগুলির জন্য ব্যবহার করে।
মুশিফিল

1
@ glmনিকমিয়ার আপনি উপরে উল্লিখিতভাবে ঠিক একইভাবে .hpp এবং .inl ব্যবহার করেন। জেনে রাখা ভাল, দুর্দান্ত উত্তরের জন্য ধন্যবাদ :)
কিংবদন্তি

তাহলে কি এটি শিরোনামের মতো?
অ্যারন ফ্রেঙ্ক

90

নিক মায়ার ঠিক বলেছেন: সংকলকটি আপনি যে ফাইলটি অন্তর্ভুক্ত করছেন তার সম্প্রসারণের বিষয়ে চিন্তা করে না, সুতরাং ".h", ".এইচপি", ".এইচএক্সএক্স", ".এইচএইচ", ".ইনল", "। ইনক" ইত্যাদি ফাইলগুলি কী ধারণ করে তা বোঝাতে এটি একটি সাধারণ কনভেনশন।

সর্বোত্তম উদাহরণ হ'ল এসটিএল হেডার ফাইলগুলি যার কোনও এক্সটেনশন নেই।

সাধারণত, ".inl" ফাইলগুলিতে ইনলাইন কোড থাকে (সুতরাং ".inl" এক্সটেনশন)।

যখন আপনার শিরোনাম কোডের মধ্যে নির্ভরতা চক্র থাকে তখন এই ফাইলগুলি ".inl" ফাইলগুলি একটি প্রয়োজনীয়তা ।

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

// A.hpp
struct A
{
    void doSomethingElse()
    {
       // Etc.
    }

    void doSomething(B & b)
    {
       b.doSomethingElse() ;
    }
} ;

এবং:

// B.hpp
struct B
{
    void doSomethingElse()
    {
       // Etc.
    }

    void doSomething(A & a)
    {
       a.doSomethingElse() ;
    }
} ;

ফরওয়ার্ড ডিক্লেয়ারেশন ব্যবহার করে আপনার এটি সংকলন করার কোনও উপায় নেই।

সমাধানটি হ'ল সংজ্ঞা এবং প্রয়োগকে দুই ধরণের শিরোলেখ ফাইলগুলিতে বিভক্ত করা:

  • hpp শিরোনাম ঘোষণা / সংজ্ঞা জন্য
  • inl শিরোনাম বাস্তবায়নের জন্য

যা নিম্নলিখিত উদাহরণে বিভক্ত হয়:

// A.hpp

struct B ;

struct A
{
    void doSomethingElse() ;
    void doSomething(B & b) ;
} ;

এবং:

// A.inl
#include <A.hpp>
#include <B.hpp>

inline void A::doSomethingElse()
{
   // Etc.
}

inline void A::doSomething(B & b)
{
   b.doSomethingElse() ;
}

এবং:

// B.hpp

struct A ;

struct B
{
    void doSomethingElse() ;
    void doSomething(A & a) ;
} ;

এবং:

// B.INL
#include <B.hpp>
#include <A.hpp>

inline void B::doSomethingElse()
{
   // Etc.
}

inline void B::doSomething(A & a)
{
   a.doSomethingElse() ;
}

এইভাবে, আপনি আপনার নিজস্ব উত্সে আপনার প্রয়োজনীয় ".inl" ফাইলটি অন্তর্ভুক্ত করতে পারেন এবং এটি কার্যকর হবে।

আবার অন্তর্ভুক্ত ফাইলগুলির প্রত্যয় নামগুলি সত্যই গুরুত্বপূর্ণ নয়, কেবল তাদের ব্যবহার।


5
এটি বিচ্ছেদের আসল উপকারিতা (বা প্রয়োজনীয়তা) ব্যাখ্যা করে এবং উত্তর হিসাবে বেছে নেওয়া উচিত ছিল।
মুশিফিল

যদি ফাংশনটি ইনলাইন না হয়, আপনি কি বাস্তবায়নের অংশের জন্য .cpp ফাইলের মান করবেন?
বুব্লাফাস

@ বুবলফাস: If the function were not inline, you would you standard .cpp file for the implementation part?সম্ভবত: টেমপ্লেটগুলি কোডের উদাহরণ যা সাধারণত .CPP ফাইলগুলিতে লুকানো যায় না, সুতরাং সেই ক্ষেত্রে, .INL ফাইলটি বাধ্যতামূলক হবে।
প্যারাসেবল

32

যেহেতু অন্য কেউ এটি উল্লেখ করেননি:

আপনার ইনলাইন ফাংশনগুলি সংরক্ষণ করতে .inl ফাইলগুলির ব্যবহার কম্পাইলগুলি গতির জন্য কার্যকর হতে পারে।

যদি আপনি কেবলমাত্র ঘোষণাগুলি (। এইচ) অন্তর্ভুক্ত করেন যেখানে আপনার ঘোষণার প্রয়োজন রয়েছে এবং কেবলমাত্র ইনলাইন বাস্তবায়ন (.inl) অন্তর্ভুক্ত করুন যেখানে আপনার প্রয়োজন (যেমন সম্ভবত কেবল .cpp এবং অন্যান্য .inl ফাইলগুলিতে .h এর নয়) রয়েছে তবে এটির একটি থাকতে পারে আপনার শিরোনাম নির্ভরতা উপর উপকারী প্রভাব।

এটি অনেকগুলি ইন্টারেক্টিভ ক্লাস সহ বৃহত্তর প্রকল্পগুলিতে একটি গুরুত্বপূর্ণ জয় হতে পারে।


7
+1: আপনি কয়েক মিলিয়ন লাইন কোড এবং হাজারো ফাইল পরিচালনা করছেন তখন বিশ্ব অবশ্যই আলাদা জায়গা place
গেটোফ্যাক্স 21

সুতরাং আপনাকে কখনই হেডার ফাইলগুলিতে .inl অন্তর্ভুক্ত করা উচিত নয়? আমার সর্বদা অনুভূতি ছিল যে .inl শিরোনাম ফাইলগুলির নীচে রাখা উচিত যেহেতু ইনলাইন ফাংশনগুলির জন্য ডিক্লেয়ারেশন এবং বাস্তবায়ন একবারে পৌঁছানো যায়।
আইসবোন1000

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

1
এটি কীভাবে দ্রুততর হতে পারে তা আমি বুঝতে পারি না, যেহেতু অনুবাদকটি অনুবাদ ইউনিটগুলিকে অন্তর্ভুক্ত এবং একত্রিত করতে আরও কাজ করতে হবে।
নিকস

1
@ নিকোস আমি মনে করি তিনি আপনার হেডারের ফাইলগুলিতে আপনার সমস্ত ইনলাইন ফাংশন রাখার সাথে সাথে তুলনামূলক দ্রুত সাশ্রয়ী ছিলেন।
কফি টেবিলস্প্রেসো

3

আমার অভিজ্ঞতায় .inl ফাইলগুলি ইনলাইন ফাংশনগুলি সংজ্ঞায়িত করতে ব্যবহৃত হয়। যখন তারা একটি .inl ফাইলে থাকে তখন ফাইলটি ইনলাইন ফাংশনগুলি পেতে এবং একটি নিয়মিত ফাংশন সংজ্ঞা পেতে .c ফাইলে অন্তর্ভুক্ত করা যায়।

এইভাবে একই উত্সটি আরও সহজেই কমপাইলারগুলির সাথে কাজ করতে পারে যার ইনলাইন ফাংশন সমর্থন নেই এবং সেইসাথে সংকলকগুলিও নেই।

এগুলি সাধারণত সরল সি কোড সহ ব্যবহৃত হয়, প্রায়শই সি ++ কোডের সাথে নয় সমস্ত সি ++ সংকলক ইনলাইন ফাংশন সমর্থন করে।


আমি কেবল সি সমর্থন পেতে এটি করার বিন্দুটি দেখতে পাচ্ছি না। সি এর জন্য, আপনি কেবল শর্তযুক্ত #define inline staticএবং শিরোনামে আপনার ইনলাইন কার্যগুলি সংজ্ঞায়িত করতে চাই ।
পাভেল মিনায়েভ

আমার ধারণা এই বাইনারি শেষ হওয়া থেকে একই ফাংশনটির একাধিক অনুলিপিগুলি এড়িয়ে চলে। আমি কেবল বলছি যে আমি .inl ফাইলগুলি এভাবে ব্যবহার করেছি, এটি নয় যে এটি একমাত্র কৌশল (বা সর্বোত্তম)।
মাইকেল বুড়

1

আমি বিশ্বাস করি এটি একটি "শিরোলেখ" ফাইলটির নামকরণের কনভেনশনে ইনলাইন কোড অন্তর্ভুক্ত রয়েছে। এটি যাতে .h ফাইলগুলির সংজ্ঞা এবং .inl ফাইলগুলিতে ইনলাইন কোড থাকতে পারে যা টেমপ্লেটগুলির জন্য প্রয়োজনীয়।

আমি বিশ্বাস করি না যে ফাইলটির উদ্দেশ্য পরিষ্কার করার জন্য নামকরণের কনভেনশন ছাড়া এর চেয়ে আরও কিছু আছে

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