যদি এই কাঠামোটি অন্য কোনও ফাইল ফানক.সি দ্বারা ব্যবহার করতে হয় তবে এটি কীভাবে করবেন?
যখন কোনও ফাইলে কোনও টাইপ ব্যবহৃত হয় (অর্থাত্ func.c ফাইল), এটি অবশ্যই দৃশ্যমান হবে। এটি করার সবচেয়ে খারাপ উপায় হ'ল প্রতিটি উত্স ফাইলটিতে এটির অনুলিপি করা উচিত।
সঠিক উপায়ে এটি একটি শিরোনাম ফাইলে রাখছে এবং যখনই প্রয়োজন হবে এই হেডার ফাইলটি অন্তর্ভুক্ত করবে।
আমরা কি নতুন হেডার ফাইলটি খুলব এবং সেখানে কাঠামোটি ঘোষনা করব এবং সেই শিরোনামটিকে ফানক সিটিতে অন্তর্ভুক্ত করব?
এটি আমার আরও পছন্দ মতো সমাধান, কারণ এটি কোডটিকে অত্যন্ত মডুলার করে। আমি আপনার স্ট্রাক্ট হিসাবে কোড করব:
#ifndef SOME_HEADER_GUARD_WITH_UNIQUE_NAME
#define SOME_HEADER_GUARD_WITH_UNIQUE_NAME
struct a
{
int i;
struct b
{
int j;
}
};
#endif
আমি এই কাঠামোটি একই শিরোনামটিতে ব্যবহার করব (যে ফাংশনটি "শব্দ" এর "ইন্টারফেসের" অংশ))
এবং সাধারণত, আমি কাঠামোর নামের পরে ফাইলটির নাম রাখতে পারতাম এবং আবার সেই নামটি ব্যবহার করে শিরোনাম রক্ষীদের সংজ্ঞা দেওয়া পছন্দ করতে বেছে নিতে পারি।
আপনার যদি স্ট্রাক্টের পয়েন্টার ব্যবহার করে কোনও ফাংশন ডিক্লেয়ার করতে হয় তবে আপনার সম্পূর্ণ স্ট্রাক্ট সংজ্ঞা প্রয়োজন হবে না। একটি সহজ ফরোয়ার্ড ঘোষণা যেমন:
struct a ;
যথেষ্ট হবে, এবং এটি সংমিশ্রণ হ্রাস।
বা আমরা শিরোনাম ফাইলে মোট কাঠামোটি সংজ্ঞায়িত করতে পারি এবং এটি Source.c এবং func.c উভয়ই অন্তর্ভুক্ত করতে পারি?
এটি অন্য উপায়, কিছুটা সহজ, তবে কম মডুলার: কিছু কোড কেবলমাত্র আপনার কাঠামোর জন্য প্রয়োজন এখনও সব ধরণের অন্তর্ভুক্ত থাকতে হবে।
সি ++ এ, এটি আকর্ষণীয় জটিলতার দিকে নিয়ে যেতে পারে, তবে এটি বিষয়বস্তু থেকে বাইরে (কোনও সি ++ ট্যাগ নেই), তাই আমি বিশদভাবে বলব না।
তারপরে কীভাবে উভয় ফাইলের মধ্যে সেই কাঠামোটিকে বাহ্যিক হিসাবে ঘোষণা করবেন। ?
আমি সম্ভবত পয়েন্টটি দেখতে ব্যর্থ, তবে গ্রেগ হিউগিলের পোস্টটিতে খুব ভাল উত্তর রয়েছে যে কোনও শিরোনামে এমন একটি কাঠামো কীভাবে ঘোষণা করতে হয় যা সি-তে একাধিক ফাইল ব্যবহার করতে হয়? ।
আমরা কীভাবে টাইপ করব?
- আপনি যদি সি ++ ব্যবহার করেন তবে করবেন না।
- আপনি যদি সি ব্যবহার করছেন, আপনার উচিত।
সি স্ট্রাক্ট পরিচালনা করা ব্যথার কারণ হতে পারে: আপনার স্ট্রাক কীওয়ার্ডটি যে কোনও জায়গায় ব্যবহার করা উচিত তা আপনাকে ঘোষণা করতে হবে:
struct MyStruct ; /* Forward declaration */
struct MyStruct
{
/* etc. */
} ;
void doSomething(struct MyStruct * p) /* parameter */
{
struct MyStruct a ; /* variable */
/* etc */
}
যদিও কোনও টাইপেইফ আপনাকে স্ট্রাক কীওয়ার্ড ছাড়াই এটি লিখতে সক্ষম করবে।
struct MyStructTag ; /* Forward declaration */
typedef struct MyStructTag
{
/* etc. */
} MyStruct ;
void doSomething(MyStruct * p) /* parameter */
{
MyStruct a ; /* variable */
/* etc */
}
এটি গুরুত্বপূর্ণ যে আপনি এখনও কাঠামোর জন্য একটি নাম রাখবেন। লেখা:
typedef struct
{
/* etc. */
} MyStruct ;
কেবলমাত্র একটি টাইপএফ-এড নামের সাথে একটি বেনামি কাঠামো তৈরি করবে এবং আপনি এটিকে ফরোয়ার্ড-ডিক্লেয়ার করতে সক্ষম হবেন না। সুতরাং নিম্নলিখিত বিন্যাসে রাখুন:
typedef struct MyStructTag
{
/* etc. */
} MyStruct ;
সুতরাং, আপনি স্ট্রাক কীওয়ার্ড যুক্ত করা এড়াতে চান যেখানেই মাইস্ট্রাক্ট ব্যবহার করতে সক্ষম হবেন এবং যখন কোনও টাইপডেফ কাজ না করে তখনই মাইস্ট্রাকট্যাগ ব্যবহার করবেন (যেমন এগিয়ে ঘোষণা)
সম্পাদনা:
জনাথন লেফলার যথাযথভাবে মন্তব্য করেছেন, C99 কাঠামো ঘোষণার বিষয়ে ভুল ধারণা সংশোধন করেছেন ।
2018-06-01 সম্পাদনা করুন:
ক্রেগ বার্নস তার মন্তব্যে আমাদের স্মরণ করিয়ে দিয়েছেন যে আপনার স্ট্রাক্ট "ট্যাগ" নাম এবং এর "টাইপডিফ" নামের আলাদা আলাদা নাম রাখার দরকার নেই, যেমন আমি পরিষ্কার করার জন্য উপরে করেছি।
প্রকৃতপক্ষে, উপরের কোডটি ভালভাবে লেখা যেতে পারে:
typedef struct MyStruct
{
/* etc. */
} MyStruct ;
আইআইআরসি, এটি সি এর সাথে সামঞ্জস্যপূর্ণ রাখার জন্য দৃশ্যের পিছনে, সহজ সরল কাঠামোর ঘোষণার সাথে এটি করে:
// C++ explicit declaration by the user
struct MyStruct
{
/* etc. */
} ;
// C++ standard then implicitly adds the following line
typedef MyStruct MyStruct;
সি তে ফিরে, আমি উভয় ব্যবহার দেখেছি (পৃথক নাম এবং একই নাম), এবং আমার জানা কোনও ত্রুটি নেই, সুতরাং একই নাম ব্যবহার করা যদি আপনি স্ট্রাক্ট এবং অন্যান্য চিহ্নগুলির জন্য সি পৃথক "নেমস্পেস" ব্যবহার না করেন তবে পড়া সহজ করে তোলে if ।
struct b
, তবে তারপরে আপনার কাঠামোটিa
এমন একটি প্রকার ঘোষণা করে যা অব্যবহৃত রয়েছে (আপনার সম্ভবত কোনও সদস্যের নাম সংজ্ঞায়িত করা উচিত, সম্ভবতk
অভ্যন্তরের নিকট বন্ধনী পরে এবং সেমিকোলনের আগে