কোন অর্ডারগুলিতে ফাইলগুলি অন্তর্ভুক্ত করা উচিত, অর্থাত্ একের আগে অন্য শিরোনাম যুক্ত করার কারণগুলি কী?
উদাহরণস্বরূপ, স্থানীয় ফাইলগুলি অন্তর্ভুক্ত করার আগে বা পরে সিস্টেম ফাইলগুলি, এসটিএল এবং বুস্ট যায়?
কোন অর্ডারগুলিতে ফাইলগুলি অন্তর্ভুক্ত করা উচিত, অর্থাত্ একের আগে অন্য শিরোনাম যুক্ত করার কারণগুলি কী?
উদাহরণস্বরূপ, স্থানীয় ফাইলগুলি অন্তর্ভুক্ত করার আগে বা পরে সিস্টেম ফাইলগুলি, এসটিএল এবং বুস্ট যায়?
উত্তর:
আমি মনে করি না যে এটি প্রস্তাবিত আদেশ রয়েছে যতক্ষণ না এটি সংকলন করে! বিরক্তিকর হ'ল যখন কিছু শিরোনামকে প্রথমে অন্য শিরোনাম অন্তর্ভুক্ত করা প্রয়োজন ... এটি শিরোনামের সাথে নয়, শিরোনামগুলির নিজেরাই এটি একটি সমস্যা।
আমার ব্যক্তিগত পছন্দটি হ'ল স্থানীয় থেকে গ্লোবাল, প্রতিটি বর্ণনানুক্রমিক ক্রমে, অর্থাৎ:
আমার ১. এর যুক্তিটি হ'ল এটি প্রমাণ করা উচিত যে প্রতিটি শিরোনাম (যার জন্য সিপিপি রয়েছে) #include
পূর্বশর্ত ছাড়াই ডি হতে পারে (টার্মিনাস টেকনিকাস: শিরোনামটি "স্ব-অন্তর্ভুক্ত")। এবং বাকিগুলি কেবল সেখান থেকে যৌক্তিকভাবে প্রবাহিত বলে মনে হচ্ছে।
মনে রাখা বড় বিষয় হ'ল আপনার শিরোনামগুলি অন্যান্য শিরোনামগুলি প্রথমে অন্তর্ভুক্ত করার উপর নির্ভর করে না। এটির বীমা করার একটি উপায় হ'ল অন্য শিরোনামের আগে আপনার শিরোনামকে অন্তর্ভুক্ত করা।
"C ++" তে বিশেষভাবে চিন্তা করে এটি উল্লেখ করেছে, Lakos এর "বৃহত্তর স্কেল সি ++ সফ্টওয়্যার ডিজাইন" উল্লেখ করে:
প্রচ্ছন্ন ব্যবহারের ত্রুটিগুলি এড়ানো যায় যে কোনও উপাদানটির .h ফাইলটি নিজের দ্বারা পার্স করা হয় - বাহ্যিকভাবে সরবরাহিত ঘোষণা বা সংজ্ঞা ছাড়াই ... .c ফাইলের প্রথম লাইন হিসাবে .h ফাইলটি অন্তর্ভুক্ত করে এটি নিশ্চিত করে যে কোনও সমালোচনামূলক অংশ নেই উপাদানটির শারীরিক ইন্টারফেসের অন্তর্নিহিত তথ্য .h ফাইলটি থেকে অনুপস্থিত (অথবা, যদি থাকে তবে আপনি .c ফাইলটি সংকলনের চেষ্টা করার সাথে সাথেই এটি সম্পর্কে সন্ধান করবেন)।
এটি বলতে গেলে, নিম্নলিখিত ক্রমে অন্তর্ভুক্ত করুন:
এই শৃঙ্খলে অন্তর্ভুক্ত হওয়ার সাথে যদি কোনও শিরোনামের সমস্যা থাকে, তবে তাদের সমাধান করুন (যদি আপনার হয়) বা সেগুলি ব্যবহার করবেন না। ক্লিনার শিরোনাম লেখেন না এমন লাইব্রেরি বয়কট করুন।
গুগলের সি ++ স্টাইল গাইডটি প্রায় বিপরীত যুক্তি দেখায়, সত্যিকার অর্থে কোনও ন্যায়সঙ্গতি নেই; আমি ব্যক্তিগতভাবে লাকোসের পদ্ধতির পক্ষে থাকি।
আমি দুটি সহজ নিয়ম অনুসরণ করি যা বিপুল সংখ্যক সমস্যা এড়ায়:
আমি এর গাইডলাইনগুলিও অনুসরণ করি:
অন্য কথায়:
#include <stdio.h>
#include <string.h>
#include "btree.h"
#include "collect_hash.h"
#include "collect_arraylist.h"
#include "globals.h"
যদিও, গাইডলাইন হওয়া, এটি একটি বিষয়গত জিনিস। অন্যদিকে নিয়মগুলি, আমি কঠোরভাবে প্রয়োগ করি, এমনকি 'র্যাপার' শিরোনামের ফাইলগুলি সরবরাহকারী পর্যায়ে এমনকি প্রহরী এবং গোষ্ঠীযুক্ত অন্তর্ভুক্ত করে যদি কিছু তাত্পর্যপূর্ণ তৃতীয় পক্ষের বিকাশকারী আমার দর্শনে সাবস্ক্রাইব না করে থাকে :-)
দেয়ালে আমার নিজের ইট যুক্ত করতে।
সুতরাং আমি সাধারণত এটি যেতে:
// myproject/src/example.cpp
#include "myproject/example.h"
#include <algorithm>
#include <set>
#include <vector>
#include <3rdparty/foo.h>
#include <3rdparty/bar.h>
#include "myproject/another.h"
#include "myproject/specific/bla.h"
#include "detail/impl.h"
প্রতিটি গ্রুপ পরের থেকে একটি ফাঁকা রেখার দ্বারা পৃথক:
এছাড়াও মনে রাখবেন যে, সিস্টেম শিরোলেখগুলি বাদে প্রতিটি ফাইলের নাম স্থানের নাম সহ একটি ফোল্ডারে থাকে, কেবল এ কারণে তাদের এগুলি ট্র্যাক করা সহজ।
#define
অন্য কোডের সাথে জড়িত তা সম্পর্কে খারাপ ) এবং অন্তর্নিহিত নির্ভরতা রোধ করার জন্য উভয়ই । উদাহরণস্বরূপ, যদি আমাদের কোড বেস শিরোনাম ফাইলটি foo.h
সত্যই নির্ভর করে <map>
তবে যে কোনও জায়গায় এটি .cc
ফাইলগুলিতে ব্যবহৃত <map>
হয়েছিল, ইতিমধ্যে অন্তর্ভুক্ত হওয়ার ঘটনা ঘটেছে, আমরা সম্ভবত লক্ষ্য করব না। যতক্ষণ না কেউ foo.h
প্রথমটি অন্তর্ভুক্ত না করে অন্তর্ভুক্ত করার চেষ্টা করেছিল <map>
। এবং তারপরে তারা বিরক্ত হবেন।
.h
কমপক্ষে একটি .cpp
রয়েছে যার মধ্যে এটি প্রথমে অন্তর্ভুক্ত রয়েছে (প্রকৃতপক্ষে, আমার ব্যক্তিগত কোডে ইউনিট পরীক্ষার সাথে সম্পর্কিত এটি প্রথমে অন্তর্ভুক্ত রয়েছে, এবং উত্স কোডটি তার অধিকারী গ্রুপে অন্তর্ভুক্ত রয়েছে) )। প্রভাবিত না হওয়ার বিষয়ে, যদি কোনও শিরোলেখ অন্তর্ভুক্ত করে <map>
তবে এর পরে অন্তর্ভুক্ত সমস্ত শিরোনাম যেভাবেই প্রভাবিত হয়, সুতরাং এটি আমার কাছে হেরে যাওয়া যুদ্ধ বলে মনে হয়।
Header corresponding to this cpp file first (sanity check)
। #include "myproject/example.h"
সমস্ত অন্তর্ভুক্ত শেষে সরানো হয় সেখানে বিশেষ কিছু আছে ?
আমি সুপারিশ:
এবং অবশ্যই, প্রতিটি বিভাগের মধ্যে বর্ণানুক্রমিক ক্রম, যেখানে সম্ভব।
#include
আপনার হেডার ফাইলগুলিতে অপ্রয়োজনীয় গুলি এড়াতে সর্বদা ফরওয়ার্ড ডিক্লেয়ারেশন ব্যবহার করুন ।
আমি দৃ sure়ভাবে নিশ্চিত যে এটি সান ওয়ার্ল্ডের কোথাও প্রস্তাবিত অনুশীলন নয়, তবে আমি চাই যে লাইন পদ্ধতিতে ফাইলের নাম দৈর্ঘ্য অন্তর্ভুক্ত থাকে, একই দৈর্ঘ্যের মধ্যে বর্ণসূচকভাবে সাজানো হয়। তাই ভালো:
#include <set>
#include <vector>
#include <algorithm>
#include <functional>
অন্তর্ভুক্তি-আদেশ নির্ভরতার লজ্জা এড়াতে আপনার নিজের শিরোনামগুলি অন্য লোকের আগে অন্তর্ভুক্ত করা ভাল ধারণা।
windows.h
।
এটি বিষয়গত নয়। নিশ্চিত করুন যে আপনার শিরোনামগুলি #include
নির্দিষ্ট ক্রমে ডি হওয়ার উপর নির্ভর করে না । আপনি নিশ্চিত হতে পারেন যে আপনি এসটিএল বা বুস্ট শিরোনাম অন্তর্ভুক্ত করবেন না কেন তা বিবেচনা করে না।
প্রথমে .cpp এর সাথে সম্পর্কিত শিরোনাম অন্তর্ভুক্ত করুন ... অন্য কথায়, অন্য কিছু যুক্ত করার আগে source1.cpp
অন্তর্ভুক্ত করা উচিত source1.h
। কেবলমাত্র ব্যতিক্রমটি আমি ভাবতে পারি যে যখন এমএসভিসি ব্যবহার করে প্রাক-সংকলিত শিরোনামগুলির সাথে কোন ক্ষেত্রে আপনাকে অন্তর্ভুক্ত করতে বাধ্য করা হয়stdafx.h
অন্য কোনও কিছুর আগে ।
যুক্তিযুক্ত:source1.h
অন্য যে কোনও ফাইলের পূর্বে অন্তর্ভুক্ত করা নিশ্চিত করে যে এটি নির্ভরতা ছাড়াই এটি একা দাঁড়িয়ে থাকতে পারে। যদি source1.h
পরবর্তী তারিখের উপর নির্ভরতা অবলম্বন করে, সংকলকটি আপনাকে তত্ক্ষণাত প্রয়োজনীয় ফরোয়ার্ড ঘোষণাগুলি যুক্ত করতে সতর্ক করবে source1.h
। এর ফলে এটি নিশ্চিত করে যে শিরোনামগুলি তাদের নির্ভরশীলদের দ্বারা যে কোনও ক্রমে অন্তর্ভুক্ত করা যায়।
উদাহরণ:
source1.h
class Class1 {
Class2 c2; // a dependency which has not been forward declared
};
source1.cpp
#include "source1.h" // now compiler will alert you saying that Class2 is undefined
// so you can forward declare Class2 within source1.h
...
এমএসভিসি ব্যবহারকারী: আমি দৃ strongly ়ভাবে প্রাক-সংকলিত শিরোনাম ব্যবহার করার পরামর্শ দিচ্ছি। সুতরাং, #include
স্ট্যান্ডার্ড শিরোনাম (এবং অন্যান্য শিরোনাম যা কখনও বদলাবে না) এর জন্য সমস্ত নির্দেশিকা সরান stdafx.h
।
সর্বাধিক নির্দিষ্ট থেকে অন্তত সুনির্দিষ্ট থেকে অন্তর্ভুক্ত করুন .cpp এর জন্য সংশ্লিষ্ট .hpp দিয়ে শুরু করুন, যদি এরকম কোনও উপস্থিত থাকে। এইভাবে, শিরোনাম ফাইলগুলির মধ্যে কোনও লুকানো নির্ভরতা যা স্বয়ংসম্পূর্ণ নয় তা প্রকাশিত হবে।
প্রাক-সংকলিত শিরোলেখ ব্যবহার করে এটি জটিল। এর চারপাশের একটি উপায় হ'ল আপনার প্রকল্প সংকলক-নির্দিষ্ট না করে প্রজম্পম্পাইল শিরোনাম ফাইল অন্তর্ভুক্ত করায় প্রকল্পের শিরোনামগুলির মধ্যে একটি ব্যবহার করা।
এটি স্ট্যান্ডার্ডের বাইরে অনেক উপাদান সহ সি / সি ++ বিশ্বে একটি কঠিন প্রশ্ন।
আমি মনে করি শিরোনামের মতো, শিরোনামের ফাইল অর্ডারটি যতক্ষণ সঙ্কলিত হয় ততক্ষণ কোনও গুরুতর সমস্যা নয়।
আমার ধারণাগুলি হ'ল: যদি এই সমস্ত শিরোলেখগুলিতে চিহ্নগুলির বিরোধ না হয় তবে কোনও আদেশ ঠিক আছে, এবং ত্রুটিযুক্ত .h এর সাথে # অন্তর্ভুক্ত লাইন যুক্ত করে শিরোনাম নির্ভরতার বিষয়টি পরে ঠিক করা যেতে পারে।
আসল ঝামেলা দেখা দেয় যখন কিছু শিরোনাম উপরে থাকে তার অনুসারে (# শর্তাদি পরীক্ষা করে) তার ক্রিয়া পরিবর্তন করে।
উদাহরণস্বরূপ, VS2005 এর stddef.h এ, রয়েছে:
#ifdef _WIN64
#define offsetof(s,m) (size_t)( (ptrdiff_t)&(((s *)0)->m) )
#else
#define offsetof(s,m) (size_t)&(((s *)0)->m)
#endif
এখন সমস্যা: যদি আমার কাছে একটি কাস্টম শিরোলেখ ("কাস্টম এইচ") থাকে যা বেশ কয়েকটি পুরানো offsetof
তাদের সিস্টেম শিরোনামে সরবরাহ করে না এমনগুলি সহ অনেকগুলি সংকলক ব্যবহার করতে হয় তবে আমার শিরোনামে আমার লেখা উচিত:
#ifndef offsetof
#define offsetof(s,m) (size_t)&(((s *)0)->m)
#endif
এবং ব্যবহারকারীকে সমস্ত সিস্টেমের শিরোনামের #include "custom.h"
পরে তা নিশ্চিত করে বলুন , অন্যথায়, offsetof
stddef.h এর রেখাটি ম্যাক্রো পুনঃনির্ধারণ ত্রুটিটি চাপিয়ে দেবে।
আমরা আমাদের কর্মজীবনে এরকম আর কোনও মামলা না দেখার জন্য প্রার্থনা করি।