সংজ্ঞা এবং ঘোষণার মধ্যে পার্থক্য কী?


857

উভয়ের অর্থ আমাকে বাদ দেয়।


91
@ লাস: সত্য নয়। একটি সংজ্ঞা উভয়ই সংজ্ঞায়িত করে এবং ঘোষণা করে ;-)
স্টিভ জেসোপ

13
সত্যি বলতে গেলে, যা শিখতে আমার অনেক সমস্যা হয়েছিল, তাই নামগুলি স্পষ্টভাবে খুঁজে পেলাম না। অর্থগুলির সাথে আমার কোনও সমস্যা ছিল না, কেবল কোন নামগুলির সাথে অর্থ যুক্ত করা যায়।
ডেভিড থর্নলি

6
তবুও, এটি কোনও সদৃশ প্রশ্ন নয়, যেহেতু এটি সি / সি ++ সম্পর্কে জিজ্ঞাসা করে, অন্য প্রশ্নটি সমস্ত ভাষা বা সাধারণভাবে কোনওটি সম্পর্কে জিজ্ঞাসা করে না। এটির সদৃশ উত্তর রয়েছে (যেহেতু অন্যান্য প্রশ্নের মধ্যে, কিছু উত্তর সি এবং / অথবা সি ++ ব্যতীত সমস্ত ভাষা উপেক্ষা করতে বেছে নিয়েছে)।
স্টিভ জেসপ

5
@ ডেভিডথর্নলি আমি এই কৌশলটি ব্যবহার করি: একটি সংজ্ঞা প্রদত্ত পরিবর্তনশীল বা ফাংশনের একটি সূক্ষ্ম বর্ণনা দেয় gives এটি মনে রাখার জন্য, আমি মনে করি যে "সংজ্ঞা" শব্দের মাঝখানে "ফাইনার" শব্দের সাথে সাদৃশ্য রয়েছে। :)
মার্কো লিওগ্র্যান্ডে

4
এই প্রশ্নটিতে কত বিড়ম্বনা রয়েছে তা অবাক করে দিন। কেবল এই ভাষাটি কতটা ভুল বোঝাবুঝি করা হয় এবং কীভাবে সেই ভুল বোঝাবুঝি রীতিমতো প্রচার করা হয় তা দেখানো যায় । সত্যিই দুঃখজনক।
অরবিট

উত্তর:


858

একটি ঘোষণা একটি শনাক্তকারীকে পরিচয় করিয়ে দেয় এবং তার প্রকারের বর্ণনা দেয়, এটি কোনও প্রকার, বস্তু বা ফাংশন হোক। একটি ঘোষণাপত্রটি হ'ল সংকলকটি সেই শনাক্তকারীটির রেফারেন্স গ্রহণ করতে পারে। এগুলি হল ঘোষণা:

extern int bar;
extern int g(int, int);
double f(int, double); // extern can be omitted for function declarations
class foo; // no extern allowed for type declarations

একটি সংজ্ঞা আসলে এই সনাক্তকারীকে ইনস্ট্যান্ট করে / প্রয়োগ করে ments এটা কি linker দরকার সেই সত্ত্বা লিঙ্ক রেফারেন্স করার জন্য। এগুলি উপরোক্ত ঘোষণার সাথে সংযুক্ত সংজ্ঞাগুলি:

int bar;
int g(int lhs, int rhs) {return lhs*rhs;}
double f(int i, double d) {return i+d;}
class foo {};

একটি ঘোষণার জায়গায় একটি সংজ্ঞা ব্যবহার করা যেতে পারে।

আপনি চান হিসাবে একটি সনাক্তকারী ঘোষণা করা যেতে পারে । সুতরাং, সি এবং সি ++ এ নিম্নলিখিতটি বৈধ:

double f(int, double);
double f(int, double);
extern double f(int, double); // the same as the two above
extern double f(int, double);

তবে এটি অবশ্যই একবার সংজ্ঞায়িত করা উচিত । আপনি যদি কোথাও ঘোষিত ও রেফারেন্সযুক্ত কিছু সংজ্ঞা দিতে ভুলে যান তবে লিঙ্কারটি কীভাবে রেফারেন্সগুলিকে লিঙ্ক করতে হবে এবং অনুপস্থিত প্রতীক সম্পর্কে অভিযোগ জানবে না। যদি আপনি একাধিকবার কোনও সংজ্ঞা দেন , তবে লিঙ্কারটি বুঝতে পারে না যে কোন সংজ্ঞাটি রেফারেন্সগুলি লিঙ্ক করতে হবে এবং সদৃশ চিহ্নগুলির বিষয়ে অভিযোগ করবে।


যেহেতু C ++ তে একটি শ্রেণির সংজ্ঞাটি বনাম শ্রেণীবদ্ধ ঘোষণা কী তা নিয়ে বিতর্কটি অব্যাহত থাকে (অন্যান্য প্রশ্নের উত্তর এবং মন্তব্যে), সুতরাং আমি এখানে সি ++ স্ট্যান্ডার্ডের একটি উদ্ধৃতি পেস্ট করব। 3.1 / 2 এ, সি ++ 03 বলেছেন:

একটি ঘোষণা হ'ল সংজ্ঞা হয় যতক্ষণ না এটি [...] বর্গ নাম ঘোষণা [...]।

3.1 / 3 তারপরে কয়েকটি উদাহরণ দেয়। তাদের মধ্যে:

[উদাহরণ: [...]
কাঠামো S {int a; ইন্ট বি; }; // এস, এস :: এ এবং এস :: বি সংজ্ঞায়িত করেছে [...]
কাঠামো এস; // এস ঘোষণা করে
এর উদাহরণ

এটি যোগ করা জন্য: দ্য সি ++ মান বিবেচনা করে struct x;একটি হতে ঘোষণা এবং struct x {};একটি সংজ্ঞা । (অন্য কথায়, "ফরোয়ার্ড ডিক্লেয়ারেশন" একটি মিসনোমোনার , যেহেতু সি ++ তে শ্রেণির ঘোষণার অন্য কোনও রূপ নেই))

লিটবকে (জোহানেস স্কাউব) ধন্যবাদ যারা তার উত্তরগুলির একটিতে প্রকৃত অধ্যায় এবং আয়াতটি খনন করেছে।


2
@ অজানা: হয় আপনার সংকলকটি আপনার বিভক্ত হয়ে গেছে এসবিআইয়ের কোডটি ভুল-কপি করেছে। উদাহরণস্বরূপ, এন 1124-এ 6.7.2 (2): "একই পদার্থ বা ফাংশনকে নির্দেশ করে এমন সমস্ত ঘোষণার ক্ষেত্রে সামঞ্জস্যপূর্ণ প্রকার থাকবে; অন্যথায়, আচরণটি সংজ্ঞায়িত।"
স্টিভ জেসোপ

4
@ ব্রায়ান: "বহিরাগত আমি;" বলে যে আমি কোথাও অন্তঃসত্ত্বা, এটি নিয়ে চিন্তা করবেন না। "ইনট আই;" এর অর্থ হ'ল আমি একটি অন্তর্নিহিত এবং এর ঠিকানা এবং সুযোগটি এখানে নির্ধারিত।
ডেভিড থর্নলি

12
@ ব্রায়ান: আপনি ভুল বলেছেন extern int iএটি একটি ঘোষণা, যেহেতু এটি কেবল পরিচয় / নির্দিষ্ট করে i। আপনি extern int iযতটা চান প্রতিটি সংকলন ইউনিটে থাকতে পারেন। int iতবে, একটি সংজ্ঞা। এটি এই অনুবাদ ইউনিটে পূর্ণসংখ্যার জন্য স্থান চিহ্নিত করে এবং লিঙ্কারকে iএই সত্তার বিরুদ্ধে সমস্ত উল্লেখকে লিঙ্ক করার পরামর্শ দেয় । আপনার যদি এই সংজ্ঞাগুলির একটির চেয়ে কম বা বেশি থাকে তবে লিঙ্কার অভিযোগ করবে।
এসবিআই

4
int i;ফাইল / গ্লোবাল স্কোপ বা ফাংশন স্কোপে @ ব্রায়ান সি এবং সি ++ উভয়ই একটি সংজ্ঞা। সিতে কারণ এটি স্টোরেজ বরাদ্দ করে, এবং সি ++ এ কারণ এটির বাহ্যিক নির্দিষ্টকারক বা লিঙ্কেজ-নির্দিষ্টকরণ নেই। এসবিআই যা বলে একই জিনিসগুলির জন্য এই পরিমাণগুলি: উভয় ক্ষেত্রেই এই ঘোষণাটি সেই ক্ষেত্রের "i" এর সাথে সম্পর্কিত সমস্ত বিষয়টিকে অবশ্যই যুক্ত করতে হবে এমন বিষয়টিকে নির্দিষ্ট করে।
স্টিভ জেসপ

4
@ অজানা, সতর্ক থাকুন আপনি শ্রেণির সুযোগে সদস্যদের পুনরায় ঘোষণা করতে পারবেন না : struct A { double f(int, double); double f(int, double); };অবশ্যই অবৈধ। যদিও এটি অন্য কোথাও অনুমোদিত। কিছু কিছু জায়গায় যেখানে আপনি কিছু জানাবেন করতে পারছি, কিন্তু সংজ্ঞায়িত খুব আছে: void f() { void g(); }বৈধ, কিন্তু না নিম্নলিখিত: void f() { void g() { } };। টেমপ্লেটগুলির কথা বলতে গেলে সংজ্ঞা কী এবং কোন ঘোষণার সূক্ষ্ম নিয়ম থাকে - সাবধান! যদিও একটি ভাল উত্তরের জন্য +1।
জোহানেস স্কাউব - 11:57

168

সি ++ স্ট্যান্ডার্ড বিভাগ 3.1 থেকে:

একটি ঘোষণা একটি অনুবাদ ইউনিটে নামগুলি প্রবর্তন করে বা পূর্বের ঘোষণাগুলির দ্বারা প্রবর্তিত নামগুলিকে পুনরায় ঘোষনা করে। একটি ঘোষণাপত্র এই নামের ব্যাখ্যা এবং বৈশিষ্ট্য নির্দিষ্ট করে।

পরবর্তী অনুচ্ছেদে বলা হয়েছে (জোর দেওয়া খনি) যে কোনও ঘোষণা একটি সংজ্ঞা হিসাবে যদি না ...

... এটি ফাংশনটির শরীর নির্দিষ্ট না করে একটি ফাংশন ঘোষণা করে:

void sqrt(double);  // declares sqrt

... এটি একটি শ্রেণীর সংজ্ঞায়নের মধ্যে একটি স্থির সদস্য ঘোষণা করে:

struct X
{
    int a;         // defines a
    static int b;  // declares b
};

... এটি একটি শ্রেণীর নাম ঘোষণা করে:

class Y;

... এটিতে externএকটি আরম্ভকারী বা ফাংশন বডি ছাড়াই কীওয়ার্ড রয়েছে :

extern const int i = 0;  // defines i
extern int j;  // declares j
extern "C"
{
    void foo();  // declares foo
}

... বা একটি typedefবা usingবিবৃতি।

typedef long LONG_32;  // declares LONG_32
using namespace std;   // declares std

এখন একটি বড় কারণের জন্য কেন একটি ঘোষণা এবং সংজ্ঞার মধ্যে পার্থক্যটি বোঝা গুরুত্বপূর্ণ: ওয়ান সংজ্ঞা বিধি । সি ++ স্ট্যান্ডার্ডের বিভাগ 3.2.1 থেকে:

কোনও অনুবাদ ইউনিটে কোনও চলক, ফাংশন, শ্রেণির ধরণ, গণনা প্রকার বা টেমপ্লেটের একাধিক সংজ্ঞা থাকতে হবে না।


"শ্রেণির সংজ্ঞায়নের মধ্যে একটি স্থির সদস্য ঘোষণা করে" - স্থির সদস্যটির সূচনা হলেও সঠিক, সঠিক? আমরা উদাহরণ তৈরি করতে পারি struct x {static int b = 3; };?
আরজেফালকোনার

@ আরজেফালকোনার আপনি সঠিক সূচনাটি অগত্যা কোনও ঘোষণাকে সংজ্ঞাতে রূপান্তরিত করে না (যেটি প্রত্যাশা করতে পারে তার বিপরীতে; অবশ্যই আমি এটি অবাক করেছিলাম)। উদাহরণস্বরূপ আপনার পরিমার্জন যদি না আসলে অবৈধ bএছাড়াও ঘোষিত হয় const। দেখুন stackoverflow.com/a/3536513/1858225 এবং daniweb.com/software-development/cpp/threads/140739/...
কাইল স্ট্র্যান্ড

1
এটি আমার কাছে আকর্ষণীয়। আপনার উত্তর অনুযায়ী, মনে হচ্ছে যে সি ++ ঘোষণা হয় এছাড়াও একটি ডেফিনেশনে (ব্যাতিক্রম আছে), যেহেতু সি মান মধ্যে এটি অন্যান্য দৃষ্টিকোণ থেকে phrased হয় (C99, বিভাগ 6.7, ঘোষণা): "একজন সংজ্ঞা একটি শনাক্তকারীর হয় সেই শনাক্তকারীর জন্য একটি ঘোষণা যা: [বিভিন্ন ক্ষেত্রে মানদণ্ড অনুসরণ করে] "। এটি দেখার বিভিন্ন উপায়, আমি মনে করি। :)
ভিক্টর জামমানিয়ান

ঘোষণাটি কোনও নাম গ্রহণ করার জন্য সংকলকটির জন্য (সংকলকটি জানান যে নামটি বৈধ, নামটি টাইপোর নয় বরং উদ্দেশ্যটির সাথে প্রবর্তিত)। সংজ্ঞাটি যেখানে একটি নাম এবং এর সামগ্রী যুক্ত হয়। সংজ্ঞাটি লিঙ্কার দ্বারা নামের বিষয়বস্তুতে কোনও নামের রেফারেন্সকে লিঙ্ক করতে ব্যবহৃত হয়।
গ্যাব 好人 好人

137

ঘোষণা: "কোথাও কোথাও একটি ফু আছে" "

সংজ্ঞা: "... এবং এটি এখানে!"


3
ঘোষণাটি কোনও নাম গ্রহণ করার জন্য সংকলকটির জন্য (সংকলকটি জানান যে নামটি বৈধ, নামটি টাইপোর নয় বরং উদ্দেশ্যটির সাথে প্রবর্তিত)। সংজ্ঞাটি যেখানে একটি নাম এবং এর সামগ্রী যুক্ত হয়। সংজ্ঞাটি লিঙ্কার দ্বারা নামের বিষয়বস্তুতে কোনও নামের রেফারেন্সকে লিঙ্ক করতে ব্যবহৃত হয়।
গ্যাব 好人 好人

46

সি ++ তে আকর্ষণীয় প্রান্তের কেস রয়েছে (এর মধ্যে কয়েকটি সিতেও রয়েছে)। বিবেচনা

T t;

এটি কোন ধরণের Tবা তার উপর নির্ভর করে কোনও সংজ্ঞা বা ঘোষণা হতে পারে :

typedef void T();
T t; // declaration of function "t"

struct X { 
  T t; // declaration of function "t".
};

typedef int T;
T t; // definition of object "t".

সি ++ তে, টেমপ্লেটগুলি ব্যবহার করার সময়, আরও একটি প্রান্তের কেস পাওয়া যায়।

template <typename T>
struct X { 
  static int member; // declaration
};

template<typename T>
int X<T>::member; // definition

template<>
int X<bool>::member; // declaration!

শেষ ঘোষণাটি কোনও সংজ্ঞা ছিল না । এটা স্ট্যাটিক সদস্যের একটি সুনির্দিষ্ট বিশেষজ্ঞতা ঘোষণা করেন X<bool>। এটি সংকলকটিকে বলে: "যদি এটি ইনস্ট্যান্টিয়েটিংয়ের কথা আসে X<bool>::memberতবে প্রাথমিক টেমপ্লেট থেকে সদস্যটির সংজ্ঞাটি ইনস্ট্যান্ট করবেন না, তবে অন্য কোথাও পাওয়া সংজ্ঞাটি ব্যবহার করুন"। এটি একটি সংজ্ঞা তৈরি করতে, আপনাকে একটি প্রাথমিক সরঞ্জাম সরবরাহ করতে হবে

template<>
int X<bool>::member = 1; // definition, belongs into a .cpp file.

35

ঘোষণা

ঘোষণাগুলি সংকলককে বলে যে কোনও প্রোগ্রামের উপাদান বা নাম বিদ্যমান। একটি ঘোষণা একটি প্রোগ্রামে এক বা একাধিক নাম প্রবর্তন করে। প্রোগ্রামে একাধিকবার ঘোষণাগুলি আসতে পারে। সুতরাং, ক্লাস, স্ট্রাকচার, গণিত প্রকার এবং অন্যান্য ব্যবহারকারী সংজ্ঞায়িত প্রকারগুলি প্রতিটি সংকলনের ইউনিটের জন্য ঘোষণা করা যেতে পারে।

সংজ্ঞা

সংজ্ঞাগুলি কী কোড বা ডেটা নাম বর্ণনা করে তা নির্দিষ্ট করে। কোনও নাম ব্যবহার করার আগে অবশ্যই তা ঘোষণা করতে হবে।


ওম, আপনি কি প্রতিটি সংকলনের ইউনিটে ক্লাস এবং এনামগুলি সংজ্ঞায়িত করতে পারবেন না ? কমপক্ষে আমি শ্রেণীর সংজ্ঞাগুলি আমার শিরোনামগুলিতে রেখেছি এবং সেগুলি জুড়ে রেখেছি। Er, class foo {}; হয় একটি বর্গ সংজ্ঞা , তাই না?
এসবিআই

1
হ্যাঁ. তবে, "ক্লাস ফু;" একটি ঘোষণা। এটি সংকলককে বলে যে foo একটি শ্রেণি। "ক্লাস ফু {};" একটি সংজ্ঞা। এটি কম্পাইলারকে বলে দেয় ক্লাস ফু কী ধরণের।
ডেভিড থর্নলি

1
ব্যতিক্রম শ্রেণীর সদস্যের নামগুলি যা তারা ঘোষণার আগে ব্যবহার করা যেতে পারে।
জোহানেস স্কাওব - 11:56

1
হ্যাঁ, এটাই আমি বোঝাতে চাইছিলাম সুতরাং আপনি নিম্নলিখিতগুলি করতে পারেন: f foo {void b () {f (); } শূন্য চ (); }, f এখনও ঘোষিত না হলেও দৃশ্যমান। নিম্নলিখিতগুলিও কাজ করে: f foo {void b (int = bar ()); টাইপিড ইনট বার; } ;. এটি "সমস্ত ফাংশন বডি, ডিফল্ট আর্গুমেন্ট, কনস্ট্রাক্টর কর্টর-ইনিশিয়ালাইজার" এর ঘোষণার আগে এটি দৃশ্যমান।
রিটার্নের ধরণে নয়

1
@ লিটিব: এটি ঘোষণার আগে এটি দৃশ্যমান নয়, কেবলমাত্র সনাক্তকারীর ব্যবহার ঘোষণার পিছনে সরানো হয়েছে। হ্যাঁ, আমি জানি, প্রভাব অনেক ক্ষেত্রে একই রকম for তবে সমস্ত ক্ষেত্রে নয়, তাই আমি মনে করি আমাদের সুনির্দিষ্ট ব্যাখ্যাটি ব্যবহার করা উচিত। - উফ, অপেক্ষা করুন। এটি ডিফল্ট যুক্তিতে দৃশ্যমান? ঠিক আছে, এটা অবশ্যই আমার বোঝার সাথে সর্বনাশ করেছে। শালা! <pouts>
এসবিআই

22

C99 স্ট্যান্ডার্ড থেকে, 6.7 (5):

একটি ঘোষণাপত্র শনাক্তকারীদের একটি সেটের ব্যাখ্যা এবং বৈশিষ্ট্য নির্দিষ্ট করে। সনাক্তকারী একটি সংজ্ঞা যে সনাক্তকারী জন্য একটি ঘোষণা যে:

  • কোনও বস্তুর জন্য, সেই বস্তুর জন্য স্টোরেজ সংরক্ষণের কারণ হয়;
  • একটি ফাংশন জন্য, ফাংশন বডি অন্তর্ভুক্ত;
  • একটি গণনা ধ্রুবক বা টাইপডিফ নামের জন্য, সনাক্তকারীটির (কেবলমাত্র) ঘোষণা।

সি ++ স্ট্যান্ডার্ড থেকে, 3.1 (2):

একটি ঘোষণাকে একটি সংজ্ঞা বলা হয় যতক্ষণ না এটি ফাংশনটির বডি উল্লেখ না করে কোনও ফাংশন ঘোষণা করে না, এতে বাহ্যিক নির্দিষ্টকারী বা সংযোগ-নির্দিষ্টকরণ এবং কোনও আরম্ভকারী বা কোনও ফাংশন-বডি থাকে না, এটি শ্রেণীর ঘোষণায় স্থিতিশীল ডেটা সদস্য হিসাবে ঘোষণা করে, এটি একটি শ্রেণীর নাম ঘোষণা, বা এটি একটি টাইপডেফ ঘোষণা, একটি ব্যবহার-ঘোষণা, বা ব্যবহারের নির্দেশ।

তারপরে কিছু উদাহরণ রয়েছে।

খুব আকর্ষণীয়ভাবে (বা না, তবে আমি এটি থেকে কিছুটা অবাক হয়েছি), typedef int myint;সি 99 এর একটি সংজ্ঞা, তবে সি ++ তে কেবল একটি ঘোষণা।


@ একবায়োন: সম্পর্কিত typedef, এর অর্থ এই নয় যে এটি সি ++ এ পুনরাবৃত্তি করা যেতে পারে, তবে সি 99 তে নয়?
এসবিআই

এটাই আমাকে অবাক করেছে, এবং যেখানেই একটি অনুবাদ ইউনিট সম্পর্কিত, হ্যাঁ পার্থক্য রয়েছে। তবে স্পষ্টতই একটি টাইপিডেফ বিভিন্ন অনুবাদ ইউনিটে সি 99 এ পুনরাবৃত্তি হতে পারে। সি এর সি ++ এর মতো স্পষ্ট "একটি সংজ্ঞা বিধি" নেই, সুতরাং এটি যে নিয়মগুলি করে এটি কেবল এটির অনুমতি দেয়। সি ++ এটিকে একটি ঘোষণাপত্রের পরিবর্তনে বেছে নিয়েছে, তবে একটি সংজ্ঞা নিয়মে এটি কী ধরণের জিনিস প্রযোজ্য তাও তালিকাভুক্ত করে, এবং টাইপডেফগুলি সেগুলির মধ্যে একটি নয়। সুতরাং ODR এর অধীনে সি ++ তে পুনরাবৃত্তি করার অনুমতি দেওয়া হবে, যদিও এটি টাইপফের সংজ্ঞা ছিল। অযথা পিক মনে হচ্ছে।
স্টিভ জেসোপ

... তবে আমি অনুমান করতে পারি যে ওডিআর-র তালিকায় আসলে সমস্ত সংখ্যার সংজ্ঞা দেওয়া সম্ভব। যদি তা হয় তবে তালিকাগুলি আসলে বেপরোয়া, এবং সাহায্যের জন্য কেবল।
স্টিভ জেসোপ

শ্রেণীর সংজ্ঞা সম্পর্কে স্ট্যান্ডের ওডিআর সংজ্ঞাটি কী বলে? তারা আছে পুনরাবৃত্তি করা।
এসবিআই

2
@ এসবিআই: ওডিআর বলেছে "(1) কোনও অনুবাদ ইউনিটে কোনও ... শ্রেণীর ধরণের" এবং "(5) এর একাধিক সংজ্ঞা থাকতে পারে না ... একটি প্রোগ্রামে একটি শ্রেণীর ধরণের একাধিক সংজ্ঞা থাকতে পারে প্রতিটি সংজ্ঞা একটি আলাদা অনুবাদ ইউনিটে উপস্থিত হয় "এবং তারপরে কিছু অতিরিক্ত প্রয়োজনীয়তা যা" সংজ্ঞাগুলি একই "হিসাবে পরিমাণে।
স্টিভ জেসোপ

17

উইকি.অ্যান্সবার্স.কম থেকে:

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

উদাহরণস্বরূপ, নিম্নলিখিত সমস্ত ঘোষণা রয়েছে:

extern int a; 
struct _tagExample { int a; int b; }; 
int myFunc (int a, int b);

অন্যদিকে সংজ্ঞার অর্থ হ'ল ঘোষণাপত্রে সমস্ত কিছু সংযোজন ছাড়াও স্মৃতিতে স্থানও সংরক্ষিত থাকে। আপনি "DEFINITION = ডিসক্লেয়ারেশন + স্পেস রিসার্ভেশন" বলতে পারেন সংজ্ঞাটির উদাহরণ নিম্নলিখিত:

int a; 
int b = 0; 
int myFunc (int a, int b) { return a + b; } 
struct _tagExample example; 

দেখতে উত্তরসমূহ


3
এটিও খুব ভুল (যদিও অন্যদের তুলনায় অনেক বেশি নিকটবর্তী): struct foo {};এটি একটি সংজ্ঞা , ঘোষণা নয়। একটি ঘোষণা fooহবে struct foo;। এর থেকে, সংকলকটি জানে না যে কতগুলি fooঅবজেক্টের জন্য সংরক্ষণ করতে হবে।
এসবিআই

1
@ মার্সিন: এসবিআই বলছে যে "এই ধরণের একটি ভেরিয়েবল তৈরি হওয়ার ক্ষেত্রে সংকলক জানে যে কত স্থান সংরক্ষণ করতে হবে" সবসময় সত্য হয় না। struct foo;এটি একটি ঘোষণা, তবে এটি কম্পাইলারকে ফু এর আকার বলে না। আমি struct _tagExample { int a; int b; };এটি সংজ্ঞা যুক্ত করব। সুতরাং এই প্রসঙ্গে এটি ঘোষণাকে কল্পনা করা বিভ্রান্তিকর। অবশ্যই এটি একটি, যেহেতু সমস্ত সংজ্ঞা হ'ল ঘোষণা, তবে আপনি মনে করছেন যে এটি কোনও সংজ্ঞা নয়। এটি _ ট্যাগ ট্যাগের একটি সংজ্ঞা।
স্টিভ জেসপ

1
@ মার্সিন গিল: যার অর্থ "উত্তরগুলি" উইকি সর্বদা নির্ভুল হয় না। এখানে ভুল তথ্য দেওয়ার জন্য আমাকে ডাউনওয়েট করতে হবে।
ডেভিড থর্নলি

1
আমরা শিখলাম যে অ্যাডটাপোস্টের উদ্ধৃতিটি সত্য তা কিন্তু সত্য (আইএমও) প্রশ্নের উত্তর দেয় না। মার্কিন যা উদ্ধৃত করেছেন তা মিথ্যা is মানগুলি উদ্ধৃত করা সত্য এবং প্রশ্নের উত্তর দেয় তবে মাথা বা লেজ তৈরি করা খুব কঠিন।
স্টিভ জেসপ

1
@ ডেভিড থর্নলি - কোনও সমস্যা নয় :) এই সাইটটি সম্পর্কে এটিই। আমরা তথ্য নির্বাচন করে যাচাই করি।
মার্সিন গিল

13

সি ++ 11 আপডেট

যেহেতু আমি এখানে সি ++ 11 এর প্রাসঙ্গিক কোনও উত্তর দেখতে পাচ্ছি না।

একটি ঘোষণা একটি সংজ্ঞা হয় যতক্ষণ না এটি একটি / এন ঘোষণা করে:

  • অস্বচ্ছ এনাম - enum X : int;
  • টেমপ্লেট প্যারামিটার - টি ইনtemplate<typename T> class MyArray;
  • প্যারামিটারের ঘোষণা - এক্স এবং ওয়াই ইনint add(int x, int y);
  • ওরফে ঘোষণা - using IntVector = std::vector<int>;
  • স্থির দাবী ঘোষণা - static_assert(sizeof(int) == 4, "Yikes!")
  • বৈশিষ্ট্য ঘোষণা (বাস্তবায়ন-সংজ্ঞায়িত)
  • খালি ঘোষণা ;

উপরের তালিকা অনুসারে সি ++ 03 থেকে প্রাপ্ত অতিরিক্ত ধারাগুলি:

  • ফাংশন ঘোষণা - যোগ মধ্যেint add(int x, int y);
  • বাহ্যিক স্পেসিফায়ারযুক্ত ঘোষণা বা লিঙ্কেজ নির্দিষ্টকরণযুক্ত - extern int a;বাextern "C" { ... };
  • ক্লাসে স্থির ডেটা সদস্য - এক্স ইনclass C { static int x; };
  • শ্রেণি / কাঠামো ঘোষণা - struct Point;
  • টাইপিডেফ ঘোষণা - typedef int Int;
  • ঘোষণা ব্যবহার - using std::cout;
  • নির্দেশ ব্যবহার করে - using namespace NS;

একটি টেম্পলেট-ঘোষণা একটি ঘোষণা। কোনও টেম্পলেট-ঘোষণাও একটি সংজ্ঞা হয় যদি এর ঘোষণায় কোনও ফাংশন, শ্রেণি বা কোনও স্থিতিশীল ডেটা সদস্যকে সংজ্ঞায়িত করা হয়।

স্ট্যান্ডার্ড থেকে উদাহরণ যা ঘোষণা এবং সংজ্ঞার মধ্যে পার্থক্য করে যে আমি তাদের মধ্যে সংক্ষিপ্তসারগুলি বুঝতে সহায়তা পেয়েছি:

// except one all these are definitions
int a;                                  // defines a
extern const int c = 1;                 // defines c
int f(int x) { return x + a; }          // defines f and defines x
struct S { int a; int b; };             // defines S, S::a, and S::b
struct X {                              // defines X
    int x;                              // defines non-static data member x
    static int y;                       // DECLARES static data member y
    X(): x(0) { }                       // defines a constructor of X
};
int X::y = 1;                           // defines X::y
enum { up , down };                     // defines up and down
namespace N { int d; }                  // defines N and N::d
namespace N1 = N;                       // defines N1
X anX;                                  // defines anX


// all these are declarations
extern int a;                           // declares a
extern const int c;                     // declares c
int f(int);                             // declares f
struct S;                               // declares S
typedef int Int;                        // declares Int
extern X anotherX;                      // declares anotherX
using N::d;                             // declares N::d


// specific to C++11 - these are not from the standard
enum X : int;                           // declares X with int as the underlying type
using IntVector = std::vector<int>;     // declares IntVector as an alias to std::vector<int>
static_assert(X::y == 1, "Oops!");      // declares a static_assert which can render the program ill-formed or have no effect like an empty declaration, depending on the result of expr
template <class T> class C;             // declares template class C
;                                       // declares nothing

6

সংজ্ঞা:

extern int a;      // Declaration 
int a;             // Definition
a = 10             // Initialization
int b = 10;        // Definition & Initialization

সংজ্ঞা পরিবর্তনশীলকে একটি প্রকারের সাথে সংযুক্ত করে এবং মেমরি বরাদ্দ করে, যেখানে ঘোষণাপত্রটি কেবল প্রকারটি নির্দিষ্ট করে তবে মেমরির বরাদ্দ দেয় না। আপনি সংজ্ঞার আগে পরিবর্তনশীল উল্লেখ করতে চাইলে ঘোষণাটি আরও কার্যকর।

* আরম্ভের সাথে সংজ্ঞাটি বিভ্রান্ত করবেন না। উভয়ই পৃথক, আরম্ভকরণ ভেরিয়েবলকে মান দেয়। উপরের উদাহরণটি দেখুন।

নিম্নলিখিত সংজ্ঞা কিছু উদাহরণ।

int a;
float b;
double c;

এখন ফাংশন ঘোষণা:

int fun(int a,int b); 

ফাংশনের শেষে সেমিকোলনটি নোট করুন যাতে এটি বলে যে এটি কেবল একটি ঘোষণা। সংকলক জানেন যে প্রোগ্রামের কোথাও সেই ফাংশনটি সেই প্রোটোটাইপের সাথে সংজ্ঞায়িত হবে । এখন যদি সংকলকটি একটি ফাংশন কল পায় এই জাতীয় কিছু

int b=fun(x,y,z);

সংকলক এমন ত্রুটি ছুঁড়ে দেবে যে এমন কোনও ফাংশন নেই। কারণ এটির জন্য এই ফাংশনটির কোনও প্রোটোটাইপ নেই।

দুটি প্রোগ্রামের মধ্যে পার্থক্য নোট করুন।

প্রোগ্রাম 1

#include <stdio.h>
void print(int a)
{
     printf("%d",a);
}
main()
{
    print(5);
}

এটিতে মুদ্রণ ফাংশনটি ঘোষিত এবং সংজ্ঞায়িতও হয়। যেহেতু সংজ্ঞা অনুসারে ফাংশন কল আসছে। এখন পরবর্তী প্রোগ্রাম দেখুন।

প্রোগ্রাম 2

 #include <stdio.h>
 void print(int a); // In this case this is essential
 main()
 {
    print(5);
 }
 void print(int a)
 {
     printf("%d",a);
 }

এটি অপরিহার্য কারণ ফাংশন কল পূর্ব সংজ্ঞা সংজ্ঞা তাই সংকলক অবশ্যই জানতে হবে যে এই জাতীয় কোনও ফাংশন আছে কিনা। সুতরাং আমরা ফাংশনটি ঘোষণা করি যা সংকলককে অবহিত করবে।

সংজ্ঞা:

ফাংশন সংজ্ঞায়নের এই অংশটিকে সংজ্ঞা বলে। এটি ফাংশনের ভিতরে কী করতে হবে তা বলে।

void print(int a)
{
    printf("%d",a);
}

2
int a; //declaration; a=10; //definitionএটি সম্পূর্ণ ভুল। স্বয়ংক্রিয় স্টোরেজ সময়কাল অবজেক্টের কথা বলার সময় (বাহ্যিকের মতো অন্য স্টোরেজ শ্রেণীর নির্দিষ্টকারীর সাথে ঘোষিত না হওয়া কোনও ফাংশন সংজ্ঞাটির অভ্যন্তরে ঘোষিত সামগ্রী) এগুলি সর্বদা সংজ্ঞা হয়।
জোয়ে পাবালিনাস

বোঝার মূল পার্থক্য হ'ল একটি ঘোষণায় বলা হচ্ছে "এমন একটি জিনিস রয়েছে যা কোথাও এই বৈশিষ্ট্যগুলি রয়েছে (টাইপ ইত্যাদি)", যেখানে একটি সংজ্ঞা বলছে "আমি এই বৈশিষ্ট্যগুলির সাথে একটি জিনিস ঘোষণা করছি, এবং আমি এখানে এটি তাত্ক্ষণিকও করছি আমরা হব." যেহেতু আপনি স্বয়ংক্রিয় স্টোরেজ সময়কাল অবজেক্টগুলি এর আগে ঘোষণা করতে পারবেন না, সেগুলি সর্বদা সংজ্ঞা থাকবে।
জোয়ে পাবালিনাস

আমি কিছু অদ্ভুত টাইপিডেফ কর্নার কেস বাদ দিয়ে যা আমি সবসময় ভুলে যাই, থাম্বের একটি নিয়ম হ'ল সমস্ত সংজ্ঞা হ'ল ঘোষণা। চিন্তা করুন; আপনি যখন কোনও কিছু তাত্ক্ষণিকভাবে চালাচ্ছেন, তখন আপনাকে সংকলকটিও বলতে হবে যে সেই জিনিসটি বিদ্যমান এবং এর বৈশিষ্ট্যগুলি কী সঠিক?
জোয়ে পাবালিনাস

আপনার প্রথম মন্তব্য অনুসারে উত্তর আপডেট করেছেন। তবে আমি এই মন্তব্যের সাথে একমত নই "আপনি যখন কিছুটা তাত্ক্ষণিকভাবে চালাচ্ছেন তখন আপনারও কম্পাইলারকে বলতে হবে যে সেই জিনিসটি বিদ্যমান"। তাত্ক্ষণিকভাবে আমরা সবসময় lh এর ধরণ নির্দিষ্ট করে না। উদাঃ a = 10 আমরা এখানে কোনও "বৈশিষ্ট্য" নির্দিষ্ট করছি না।
শ্রীধরন

4

সংজ্ঞা অর্থ প্রকৃত ফাংশন লিখিত এবং ঘোষণার অর্থ উদাহরণস্বরূপ সরল ঘোষিত কার্য

void  myfunction(); //this is simple declaration

এবং

void myfunction()
{
 some statement;    
}

এটি ফাংশন myfunction সংজ্ঞা


1
এবং প্রকার এবং অবজেক্ট সম্পর্কে কি?
এসবিআই

4

চলতি নিয়ম:

  • একটি ঘোষণা সংকলককে মেমরিতে ভেরিয়েবলের ডেটা কীভাবে ব্যাখ্যা করতে হয় তা বলে। প্রতিটি অ্যাক্সেসের জন্য এটি প্রয়োজন।

  • একটি সংজ্ঞা পরিবর্তনশীল বিদ্যমান করতে মেমরি সংরক্ষণ করে। প্রথম অ্যাক্সেসের ঠিক আগে এটি ঘটতে হবে।


2
এটি কেবল বস্তুর জন্য ধারণ করে। প্রকার ও কার্যকারিতা সম্পর্কে কী বলা যায়?
অরবিট

4

বিশেষ্যগুলি বুঝতে, প্রথমে ক্রিয়াগুলিতে ফোকাস করা যাক।

ডিক্লেয়ার - to আনুষ্ঠানিকভাবে ঘোষণা; বলুন

সংজ্ঞায়িত - পরিষ্কার বা সম্পূর্ণরূপে (কাউকে বা কিছু) প্রদর্শন বা বর্ণনা করতে

সুতরাং, যখন আপনি কিছু ঘোষণা করেন, আপনি কেবল এটি কী তা জানান

// declaration
int sum(int, int);

এই লাইনটি একটি সি ফাংশন ঘোষণা করেsum যা দুটি ধরণের আর্গুমেন্ট নেয় intএবং একটি প্রদান করে int। তবে আপনি এটি এখনও ব্যবহার করতে পারবেন না।

আপনি যখন সরবরাহ করেন এটি আসলে কীভাবে কাজ করে , এটি এর সংজ্ঞা।

// definition
int sum(int x, int y)
{
    return x + y;
}

3

ঘোষণা এবং সংজ্ঞা মধ্যে পার্থক্য বুঝতে আমাদের সমাবেশ কোড দেখতে হবে:

uint8_t   ui8 = 5;  |   movb    $0x5,-0x45(%rbp)
int         i = 5;  |   movl    $0x5,-0x3c(%rbp)
uint32_t ui32 = 5;  |   movl    $0x5,-0x38(%rbp)
uint64_t ui64 = 5;  |   movq    $0x5,-0x10(%rbp)
double   doub = 5;  |   movsd   0x328(%rip),%xmm0        # 0x400a20
                        movsd   %xmm0,-0x8(%rbp)

এবং এটি কেবল সংজ্ঞা:

ui8 = 5;   |   movb    $0x5,-0x45(%rbp)
i = 5;     |   movl    $0x5,-0x3c(%rbp)
ui32 = 5;  |   movl    $0x5,-0x38(%rbp)
ui64 = 5;  |   movq    $0x5,-0x10(%rbp)
doub = 5;  |   movsd   0x328(%rip),%xmm0        # 0x400a20
               movsd   %xmm0,-0x8(%rbp)

আপনি কিছুই পরিবর্তন দেখতে পাবেন।

ঘোষণা সংজ্ঞা থেকে পৃথক কারণ এটি কেবল সংকলক দ্বারা ব্যবহৃত তথ্য দেয়। উদাহরণস্বরূপ uint8_t সংকলককে asm ফাংশন Movb ব্যবহার করতে বলুন।

ওটা দেখ:

uint def;                  |  no instructions
printf("some stuff...");   |  [...] callq   0x400450 <printf@plt>
def=5;                     |  movb    $0x5,-0x45(%rbp)

ঘোষণায় কোনও সমতুল্য নির্দেশনা নেই কারণ এটি কার্যকর করার মতো কিছু নয়।

তদুপরি ঘোষণাপত্রটি কম্পাইলারকে ভেরিয়েবলের সুযোগ বলে।

আমরা বলতে পারি যে ঘোষণাপত্রটি চলকটির সঠিক ব্যবহার প্রতিষ্ঠার জন্য এবং কিছু স্মৃতি কতক্ষণ নির্দিষ্ট ভেরিয়েবলের সাথে সম্পর্কিত তা সংস্থার দ্বারা ব্যবহৃত তথ্য।


2

আপনি কি সর্বাধিক সাধারণ শর্তে বলতে পারেন যে ঘোষণাটি এমন একটি সনাক্তকারী যা কোনও স্টোরেজ বরাদ্দ করা হয় না এবং সংজ্ঞা আসলে ঘোষিত শনাক্তকারী থেকে স্টোরেজ বরাদ্দ করে?

একটি আকর্ষণীয় চিন্তা - শ্রেণী বা ফাংশন প্রকারের তথ্যের সাথে সংযুক্ত না হওয়া পর্যন্ত কোনও টেম্পলেট স্টোরেজ বরাদ্দ করতে পারে না। সুতরাং টেমপ্লেট সনাক্তকারী একটি ঘোষণা বা সংজ্ঞা? এটি কোনও ঘোষণা হতে হবে যেহেতু কোনও স্টোরেজ বরাদ্দ করা হয়নি, এবং আপনি কেবল টেম্পলেট শ্রেণি বা ফাংশনটি 'প্রোটোটাইপিং' করছেন।


1
আপনার সংজ্ঞা প্রতি ভুল না, তবে ফাংশন সংজ্ঞা যখন আসে তখন "স্টোরেজ সংজ্ঞা" সর্বদা বিশ্রী মনে হয়। টেমপ্লেট সম্পর্কিত: এটি template<class T> struct foo;একটি টেম্পলেট ঘোষণা এবং এটিওtemplate<class T> void f(); । টেম্পলেট সংজ্ঞা একইভাবে আয়না শ্রেণি / ফাংশন সংজ্ঞা। (দ্রষ্টব্য যে কোনও টেম্পলেটটির নাম কোনও প্রকার বা ফাংশনের নাম নয় One আপনি যখন এটি দেখতে পাচ্ছেন এমন এক জায়গাটি যখন আপনি অন্য টেমপ্লেটের টাইপ প্যারামিটার হিসাবে কোনও টেম্পলেট পাস করতে পারবেন না you )
এসবিআই

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

2

এখানে অনুরূপ উত্তরগুলি সন্ধান করুন: প্রযুক্তিগত সাক্ষাত্কারের প্রশ্নগুলি সি

একটি ঘোষণা প্রোগ্রামের একটি নাম সরবরাহ করে; একটি সংজ্ঞা প্রোগ্রামের মধ্যে একটি সত্তার (যেমন প্রকার, উদাহরণ এবং ফাংশন) এর অনন্য বর্ণনা সরবরাহ করে। ঘোষণাগুলি প্রদত্ত সুযোগে পুনরাবৃত্তি করা যেতে পারে, এটি প্রদত্ত সুযোগে একটি নাম প্রবর্তন করে।

একটি ঘোষণা একটি সংজ্ঞা হয় যতক্ষণ না:

  • ঘোষণাটি তার দেহ নির্দিষ্ট না করে কোনও ফাংশন ঘোষণা করে,
  • ঘোষণায় একটি বাহ্যিক নির্দিষ্টকারী থাকে এবং কোনও আরম্ভকারী বা ফাংশন বডি থাকে না,
  • ঘোষণা হ'ল শ্রেণীর সংজ্ঞা ছাড়াই স্থির শ্রেণির ডেটা সদস্যের ঘোষণা,
  • ঘোষণা একটি শ্রেণীর নামের সংজ্ঞা,

সংজ্ঞাটি হ'ল ঘোষণা হিসাবে:

  • সংজ্ঞা একটি স্ট্যাটিক শ্রেণীর ডেটা সদস্যকে সংজ্ঞায়িত করে,
  • সংজ্ঞাটি একটি অন-ইনলাইন সদস্য ফাংশনকে সংজ্ঞায়িত করে।

1

এটি সত্যই উদাসীন শোনায় তবে আমি শর্তগুলি সরাসরি আমার মাথায় রাখতে সক্ষম হয়েছি এটি সবচেয়ে ভাল উপায়:

ঘোষণা: ছবি টমাস জেফারসন একটি ভাষণ দিচ্ছেন ... "আমি এই সিদ্ধান্তটি গ্রহণ করি যে এই বিষয়টিকে এই উত্সের কোডে রয়েছে !!!"

সংজ্ঞা: একটি অভিধানের চিত্র দিন, আপনি ফু-র সন্ধান করছেন এবং এর প্রকৃত অর্থ।


1

একটি ঘোষণাপত্রটি সংকলকের কাছে একটি প্রতীক নাম উপস্থাপন করে। একটি সংজ্ঞা একটি ঘোষণা যা প্রতীকটির জন্য স্থান বরাদ্দ করে।

int f(int x); // function declaration (I know f exists)

int f(int x) { return 2*x; } // declaration and definition

1

জিএনইউ সি লাইব্রেরির ম্যানুয়াল অনুসারে ( http://www.gnu.org/software/libc/manual/html_node/Header-Files.html )

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


0

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


1
এটি ঘোষণাকে সংজ্ঞা দিয়ে বিভ্রান্ত করে এবং এটি সম্পূর্ণ ভুল।
এসবিআই

0

আমার প্রিয় উদাহরণটি "ইনট নুম = 5" এখানে আপনার ভেরিয়েবলটি 1 টি সংজ্ঞায়িত করা হয়েছে 2 ইনট 2 হিসাবে ঘোষিত এবং 3. পাঁচটির মান সহ ইনস্ট্যান্টিয়েটেড। আমরা

  • কোনও অবজেক্টের ধরণ নির্ধারণ করুন, যা অন্তর্নির্মিত বা শ্রেণি বা কাঠামোযুক্ত হতে পারে।
  • কোনও বস্তুর নাম ঘোষণা করুন, সুতরাং নামের সাথে যে কোনও কিছু ঘোষণা করা হয়েছে যার মধ্যে চলক, ফাংশন ইত্যাদি রয়েছে includes

কোনও শ্রেণি বা কাঠামো আপনাকে যখন পরে ব্যবহার করা হয় তখন কীভাবে সংজ্ঞা দেওয়া হবে তা পরিবর্তন করতে দেয়। উদাহরণ স্বরূপ

  • কেউ একটি ভিন্ন ভিন্ন পরিবর্তনশীল বা অ্যারে ঘোষণা করতে পারেন যা নির্দিষ্টভাবে সংজ্ঞায়িত হয় না।
  • সি ++ এ অফসেট ব্যবহার করে আপনি এমন কোনও বস্তুর সংজ্ঞা দিতে পারেন যার ঘোষিত নাম নেই।

আমরা যখন প্রোগ্রামিং শিখি তখন এই দুটি পদটি প্রায়শই বিভ্রান্ত হয় কারণ আমরা প্রায়শই একই সময়ে একই সাথে করি।


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

0

সম্পাদনযোগ্য প্রজন্মের পর্যায়:

(1) প্রাক প্রসেসর -> (2) অনুবাদক / সংকলক -> (3) লিঙ্কার

দ্বিতীয় পর্যায়ে (অনুবাদক / সংকলক), আমাদের কোডে ঘোষণাপত্রের বিবৃতি সংকলককে বলে যে আমরা ভবিষ্যতে এই জিনিসগুলি ব্যবহার করতে যাচ্ছি এবং আপনি পরে সংজ্ঞা পেতে পারেন, অর্থ:

অনুবাদক নিশ্চিত করুন যে: কি? অর্থ ঘোষণা

এবং (3) পর্যায়ে (লিঙ্কার) জিনিসগুলি আবদ্ধ করার জন্য সংজ্ঞা প্রয়োজন

লিঙ্কার নিশ্চিত করুন যে: কোথায়? সংজ্ঞা


0

কে ওআর (২ য় সংস্করণ) জুড়ে ছড়িয়ে দেওয়া কিছু খুব স্পষ্ট সংজ্ঞা রয়েছে; এটি সেগুলিকে এক জায়গায় রাখতে এবং সেগুলি এক হিসাবে পড়তে সহায়তা করে:

"সংজ্ঞা" সেই স্থানটিকে বোঝায় যেখানে ভেরিয়েবলটি তৈরি করা হয় বা নির্ধারিত স্টোরেজ দেওয়া হয়; "ঘোষণা" সেই স্থানগুলিকে বোঝায় যেখানে ভেরিয়েবলের প্রকৃতি বর্ণিত হয় তবে কোনও স্টোরেজ বরাদ্দ করা হয় না। [পৃ। 33]

...

বাহ্যিক ভেরিয়েবলের ঘোষণাপত্র এবং এর সংজ্ঞা মধ্যে পার্থক্য করা গুরুত্বপূর্ণ । একটি ঘোষণাপত্র একটি ভেরিয়েবলের বৈশিষ্ট্য ঘোষণা করে (প্রাথমিকভাবে এটির ধরণ); একটি সংজ্ঞা এছাড়াও স্টোরেজ পৃথক করা কারণ। লাইন থাকলে

int sp;
double val[MAXVAL]

যে কোনও ফাংশনের বাইরে উপস্থিত হয়ে তারা বাহ্যিক ভেরিয়েবলগুলি সংজ্ঞায়িত করে spএবং valস্টোরেজকে আলাদা করে রাখে এবং সেই উত্স ফাইলের বাকী অংশের ঘোষণার কাজ করে।

অন্যদিকে, লাইনগুলি

extern int sp;
extern double val[];

বাকি উত্স ফাইলের জন্য ঘোষণা করুন যা spএকটি intএবং এটি valএকটি doubleঅ্যারে (যার আকার অন্যত্র নির্ধারিত হয়) তবে তারা ভেরিয়েবলগুলি তৈরি করে না বা তাদের জন্য সঞ্চয়স্থান সংরক্ষণ করে না।

উত্স প্রোগ্রামটি তৈরি করা সমস্ত ফাইলের মধ্যে একটি বাহ্যিক ভেরিয়েবলের কেবল একটি সংজ্ঞা থাকতে হবে । ... অ্যারে মাপগুলি সংজ্ঞা সহ নির্দিষ্ট করা আবশ্যক তবে এটি একটি সহ alচ্ছিকextern ঘোষণার optionচ্ছিক। [পিপি। 80-81]

...

ঘোষণাগুলি প্রতিটি সনাক্তকারীকে প্রদত্ত ব্যাখ্যা নির্দিষ্ট করে; এগুলি শনাক্তকারীর সাথে জড়িত স্টোরেজ অগত্যা সংরক্ষণ করে না। রিজার্ভ স্টোরেজ যে ঘোষণাগুলি সংজ্ঞা বলা হয় । [পৃ। 210]


-1

ঘোষণার অর্থ একটি ভেরিয়েবলের নাম এবং প্রকার (ভেরিয়েবল ঘোষণার ক্ষেত্রে) টাইপ করুন, যেমন:

int i;

অথবা দেহ ছাড়াই কোনও ফাংশনে নাম, রিটার্ন টাইপ এবং পরামিতি (গুলি) টাইপ দিন (ফাংশন ঘোষণার ক্ষেত্রে), যেমন:

int max(int, int);

যদিও সংজ্ঞা অর্থ একটি ভেরিয়েবলের মান নির্ধারণ (পরিবর্তনশীল সংজ্ঞা ক্ষেত্রে), যেমন:

i = 20;

বা কোনও ফাংশনে বডি (ক্রিয়াশীলতা) সরবরাহ / যোগ করাকে ফাংশন সংজ্ঞা বলা হয়, যেমন:

int max(int a, int b)
{
   if(a>b)   return a;
   return b;  
}

অনেক সময় ঘোষণা এবং সংজ্ঞা হিসাবে একসাথে করা যেতে পারে:

int i=20;

এবং:

int max(int a, int b)
{
    if(a>b)   return a;
    return b;    
} 

উপরে ক্ষেত্রেই আমরা সংজ্ঞায়িত ঘোষণা পরিবর্তনশীল iএবং function max()


সংজ্ঞাটির আসল গড় যদি কোনও ভেরিয়েবল / ফাংশনকে মান / দেহ নির্দিষ্ট করতে হয় তবে ঘোষণার অর্থ হল একটি ভেরিয়েবল / ফাংশনটির নাম, টাইপ দেওয়া
পুনেত পুরোহিত

আপনি কোনও মান নির্ধারণ না করে কোনও সংজ্ঞা দিতে পারেন।
অরবিট

1
ঠিক int x;
এটির

এটি এর পরিবর্তনশীল x এর ঘোষণার জন্য এটির সংজ্ঞা নয়
পুনেত পুরোহিত

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