স্ট্রাক্ট সংজ্ঞাগুলি .h বা .c ফাইলের মধ্যে যাওয়া উচিত?


102

আমি structহেডারে s এর সম্পূর্ণ সংজ্ঞা এবং কেবলমাত্র ঘোষণাপত্রই দেখেছি - অন্য পদ্ধতির চেয়ে কোনও পদ্ধতির কি কোনও সুবিধা আছে?

যদি এটি কোনও পার্থক্য করে তবে আমি সাধারণত স্ট্রাইকটি টাইপ করি f .h

typedef struct s s_t;

সম্পাদন করা

পরিষ্কার হওয়ার জন্য, অপশন হ'ল ক্লাবে শিরোনাম ফাইল এবং সংজ্ঞা, বা শিরোলেখ ফাইলটিতে ঘোষণা এবং সংজ্ঞা উভয়। উভয়ের একই ব্যবহারের ফলস্বরূপ হওয়া উচিত, এমনকি যদি কোনও যোগসূত্র দ্বারা হয় তবে তাদের উচিত নয়?


আমি প্রায় অনেকগুলি নকল দেখতে পাচ্ছি, যেমন এখানে তবে কোনও সঠিক মিল নেই। আমি এই বিষয়ে ভুল হলে দয়া করে আমাকে সংশোধন করুন।


2
আপনি কি একটি অস্বচ্ছ বা অস্বচ্ছ স্ট্রাক্ট চান?

4
পার্শ্ব নোট, শনাক্তকারীরা _tPOSIX দ্বারা সংরক্ষিত, তাই এটি সাধারণত একটি খারাপ ধারণা। আপনি ঠিক করতে পারে typedef struct toto toto
জেনস গুস্ট্ট

আমি _tঅন্যান্য জায়গাগুলিতে প্রচুর ব্যবহার দেখেছি (যেমন, লাইটটিপ, লিনাক্স) ... এবং আমি প্রজিডেন্ট_ দিয়ে জিনিসগুলি উপসর্গ করেছি, সুতরাং এটি কি সমস্যা হওয়া উচিত নয়?
হারুন যোডাইকেন

এবং @ ডব্লিউটিপি, আমি মনে করি যে অপ-অস্বচ্ছকে সাধারণত আরও ভাল এবং আরও Cইশ হিসাবে বিবেচনা করা হয় , না ( FILEউদাহরণ সহ যা আছে )। সুতরাং, অস্বচ্ছ নয়।
হারুন যোডাইকেন

যদি এটি একটি অস্বচ্ছ স্ট্রাক্ট হয় তবে এটি একটি শিরোনাম ফাইলে যেতে হবে বা আপনার কোডটি DRY নয় (নিজেকে পুনরাবৃত্তি করবেন না)।

উত্তর:


107

এই ফাইলটির জন্য ব্যক্তিগত কাঠামো .c ফাইলের মধ্যে থাকা উচিত the

পাবলিক স্ট্রাকচারগুলি .h ফাইলে যেতে হবে।


4
আমি মনে করি আমি এই উত্তরটির সাথে আরও একমত। এটি অন্য কোনও .c ফাইলগুলির মাধ্যমে স্ট্রাকটি ব্যবহার করার বিষয়ে নয় বা স্ট্রাক্টটিকে জনসাধারণ হিসাবে বিবেচনা করা উচিত (এবং তাই, অ্যাক্সেসযোগ্য) কিনা।
c00kiemon5ter

@ τεκ আপনার অর্থ globalএবং localদৃশ্যমানতা? publicএকটি কাঠামো মধ্যে বোঝায় না। সমস্ত স্ট্রাক্ট ডিফল্টরূপে সর্বজনীন।
বাগশটজিজি

3
@ জিও পাপাস এটি সি সম্পর্কে একটি প্রশ্ন যা সি- publicতে কোনও কীওয়ার্ড নয় আপনি নীচের দিকে ম্যাথু স্ল্যাটারির উত্তরটি দেখলে আপনি দেখতে পাচ্ছেন যে যখন ব্যবহারকারী কোনও সদস্যের সদস্য ব্যবহার করার চেষ্টা করে তখন শিরোনামে কেবলমাত্র একটি ফরোয়ার্ড ঘোষণার সাহায্যে একটি সংকলক ত্রুটির কারণ হয় বেসরকারী (অস্বচ্ছ) স্ট্রাক্ট
τεκ

68

উভয়ের একই ব্যবহারের ফলস্বরূপ হওয়া উচিত, এমনকি যদি কোনও যোগসূত্র দ্বারা হয় তবে তাদের উচিত নয়?

না, যখন আপনি একই শিরোনাম সহ অন্যান্য .c ফাইলগুলি বিবেচনা করেন তখন তা নয়। কাঠামোর সংজ্ঞাটি সংকলকটির কাছে দৃশ্যমান না হলে সেই সংজ্ঞাটির বিশদ ব্যবহার করা যাবে না। সংজ্ঞা ছাড়াই একটি ঘোষণাপত্র (উদাহরণস্বরূপ ন্যায়সঙ্গত struct s;) কোনও কিছুর ভিতরে তাকাতে চেষ্টা করলে কম্পাইলারটি ব্যর্থ struct sহয়ে যায়, তবুও এটি উদাহরণস্বরূপ সংকলন করার অনুমতি দেয় struct s *foo;(যতক্ষণ fooনা পরে নির্ধারিত হয় না)।

এই সংস্করণ তুলনা api.hএবং api.c:

Definition in header:                 Definition in implementation:
+---------------------------------+   +---------------------------------+
| struct s {                      |   | struct s;                       |
|     int internal;               |   |                                 |
|     int other_stuff;            |   | extern void                     |
| };                              |   | api_func(struct s *foo, int x); |
|                                 |   +---------------------------------+
| extern void                     |   +---------------------------------+
| api_func(struct s *foo, int x); |   | #include "api.h"                |
+---------------------------------+   |                                 |
+---------------------------------+   | struct s {                      |
| #include "api.h"                |   |     int internal;               |
|                                 |   |     int other_stuff;            |
| void                            |   | };                              |
| api_func(struct s *foo, int x)  |   |                                 |
| {                               |   | void                            |
|     foo->internal = x;          |   | api_func(struct s *foo, int x)  |
| }                               |   | {                               |
+---------------------------------+   |     foo->internal = x;          |
                                      | }                               |
                                      +---------------------------------+

এপিআই-র এই ক্লায়েন্টটি যে কোনও সংস্করণ দিয়ে কাজ করে:

#include "api.h"

void good(struct s *foo)
{
    api_func(foo, 123);
}

এটি বাস্তবায়নের বিশদটি ঘিরে ধরে:

#include "api.h"

void bad(struct s *foo)
{
    foo->internal = 123;
}

যা "শিরোনামে সংজ্ঞা" সংস্করণ নিয়ে কাজ করবে, তবে "বাস্তবায়নের সংজ্ঞা" সংস্করণের সাথে নয়, যেমন পরবর্তী ক্ষেত্রে সংকলকটির কাঠামোর বিন্যাসের কোনও দৃশ্যমানতা নেই:

$ gcc -Wall -c bad.c
bad.c: In function 'bad':
bad.c:5: error: dereferencing pointer to incomplete type
$

সুতরাং, "বাস্তবায়নের সংজ্ঞা" সংস্করণটি দুর্ঘটনাজনিত বা ব্যক্তিগত প্রয়োগের বিশদগুলির ইচ্ছাকৃত অপব্যবহারের বিরুদ্ধে সুরক্ষা দেয়।


3
আপনি কীভাবে এই কোডগুলি উইন্ডোজ তৈরি করেছেন এবং এখনও তাদের ভিতরে কোড হাইলাইট করেছেন তা জানতে চান ... ম্যানুয়ালি? এই ওপি
স্ট্যাকওভারফ্লো

চমৎকার উদাহরণ! ধন্যবাদ!
ভিক্টর হেইন

যেমন উদাহরণের জন্য আপনাকে ধন্যবাদ! dereferencing pointer to incomplete typeঠিক আমার ঘটনা ছিল!
তৈমুর ফয়েজরাখমানভ

আমি কেবল এটি যুক্ত করতে চাই যে সমস্ত প্রকাশ্যে অ্যাক্সেসযোগ্য স্ট্রাক্টগুলি খারাপ নয়: আপনি উদাহরণস্বরূপ আপনার API এর ব্যবহারকারীকে ডেটা পূরণ করতে এবং এটি প্রেরণে সক্ষম করতে চাইতে পারেন
আলেকজান্ডার টর্স্টলিং

@ মাহেশা ৯৯৯, সেখানে কোন জাদু নেই। আপনি এতে আবর্জনা রেখে দিলেও এসও কোড হাইলাইট করে। পরে পোস্টে কমান্ড লাইন আউটপুট হাইলাইট করার চেষ্টা করছে তা লক্ষ্য করুন।
উইঙ্গার সেনডন

8

যদি স্ট্রাক্টটি অন্য সংকলন ইউনিট (.c ফাইল) দ্বারা ব্যবহার করা হয় তবে এটি হেডার ফাইলে রাখুন যাতে আপনি যেখানে প্রয়োজন সেখানে head হেডার ফাইলটি অন্তর্ভুক্ত করতে পারেন।

যদি স্ট্রাক্টটি কেবলমাত্র একটি সংকলন ইউনিটে (.c ফাইল) ব্যবহার করা হয় তবে আপনি এটি .c ফাইলটিতে স্থাপন করেন।


3

মুল বক্তব্যটি হ'ল একটি হেডার ফাইলে স্থাপন করা আপনাকে একাধিক উত্স ফাইল থেকে কাঠামোটি (বা অন্য কোনও সংজ্ঞা) ব্যবহার করতে দেয়, কেবল সেই হেডার ফাইলটি অন্তর্ভুক্ত করে।

তবে আপনি যদি নিশ্চিত হন যে এটি কেবল একটি উত্স ফাইল থেকে ব্যবহৃত হবে, তবে এটি আসলে কোনও তফাত করে না।



-4

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


8
-1: আপনি যদি ভাল সফ্টওয়্যার ইঞ্জিনিয়ারিং (বিমূর্ততা, মডুলারিটি ইত্যাদি) সম্পর্কে চিন্তা করেন তবে আপনি কাঠামো সংজ্ঞাটি কোথায় রেখেছেন তা বাস্তবে গুরুত্বপূর্ণ নয়
পল আর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.