উভয়ের অর্থ আমাকে বাদ দেয়।
উভয়ের অর্থ আমাকে বাদ দেয়।
উত্তর:
একটি ঘোষণা একটি শনাক্তকারীকে পরিচয় করিয়ে দেয় এবং তার প্রকারের বর্ণনা দেয়, এটি কোনও প্রকার, বস্তু বা ফাংশন হোক। একটি ঘোষণাপত্রটি হ'ল সংকলকটি সেই শনাক্তকারীটির রেফারেন্স গ্রহণ করতে পারে। এগুলি হল ঘোষণা:
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 {};
একটি সংজ্ঞা । (অন্য কথায়, "ফরোয়ার্ড ডিক্লেয়ারেশন" একটি মিসনোমোনার , যেহেতু সি ++ তে শ্রেণির ঘোষণার অন্য কোনও রূপ নেই))
লিটবকে (জোহানেস স্কাউব) ধন্যবাদ যারা তার উত্তরগুলির একটিতে প্রকৃত অধ্যায় এবং আয়াতটি খনন করেছে।
extern int i
এটি একটি ঘোষণা, যেহেতু এটি কেবল পরিচয় / নির্দিষ্ট করে i
। আপনি extern int i
যতটা চান প্রতিটি সংকলন ইউনিটে থাকতে পারেন। int i
তবে, একটি সংজ্ঞা। এটি এই অনুবাদ ইউনিটে পূর্ণসংখ্যার জন্য স্থান চিহ্নিত করে এবং লিঙ্কারকে i
এই সত্তার বিরুদ্ধে সমস্ত উল্লেখকে লিঙ্ক করার পরামর্শ দেয় । আপনার যদি এই সংজ্ঞাগুলির একটির চেয়ে কম বা বেশি থাকে তবে লিঙ্কার অভিযোগ করবে।
int i;
ফাইল / গ্লোবাল স্কোপ বা ফাংশন স্কোপে @ ব্রায়ান সি এবং সি ++ উভয়ই একটি সংজ্ঞা। সিতে কারণ এটি স্টোরেজ বরাদ্দ করে, এবং সি ++ এ কারণ এটির বাহ্যিক নির্দিষ্টকারক বা লিঙ্কেজ-নির্দিষ্টকরণ নেই। এসবিআই যা বলে একই জিনিসগুলির জন্য এই পরিমাণগুলি: উভয় ক্ষেত্রেই এই ঘোষণাটি সেই ক্ষেত্রের "i" এর সাথে সম্পর্কিত সমস্ত বিষয়টিকে অবশ্যই যুক্ত করতে হবে এমন বিষয়টিকে নির্দিষ্ট করে।
struct A { double f(int, double); double f(int, double); };
অবশ্যই অবৈধ। যদিও এটি অন্য কোথাও অনুমোদিত। কিছু কিছু জায়গায় যেখানে আপনি কিছু জানাবেন করতে পারছি, কিন্তু সংজ্ঞায়িত খুব আছে: void f() { void g(); }
বৈধ, কিন্তু না নিম্নলিখিত: void f() { void g() { } };
। টেমপ্লেটগুলির কথা বলতে গেলে সংজ্ঞা কী এবং কোন ঘোষণার সূক্ষ্ম নিয়ম থাকে - সাবধান! যদিও একটি ভাল উত্তরের জন্য +1।
সি ++ স্ট্যান্ডার্ড বিভাগ 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/... ।
ঘোষণা: "কোথাও কোথাও একটি ফু আছে" "
সংজ্ঞা: "... এবং এটি এখানে!"
সি ++ তে আকর্ষণীয় প্রান্তের কেস রয়েছে (এর মধ্যে কয়েকটি সিতেও রয়েছে)। বিবেচনা
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.
ঘোষণা
ঘোষণাগুলি সংকলককে বলে যে কোনও প্রোগ্রামের উপাদান বা নাম বিদ্যমান। একটি ঘোষণা একটি প্রোগ্রামে এক বা একাধিক নাম প্রবর্তন করে। প্রোগ্রামে একাধিকবার ঘোষণাগুলি আসতে পারে। সুতরাং, ক্লাস, স্ট্রাকচার, গণিত প্রকার এবং অন্যান্য ব্যবহারকারী সংজ্ঞায়িত প্রকারগুলি প্রতিটি সংকলনের ইউনিটের জন্য ঘোষণা করা যেতে পারে।
সংজ্ঞা
সংজ্ঞাগুলি কী কোড বা ডেটা নাম বর্ণনা করে তা নির্দিষ্ট করে। কোনও নাম ব্যবহার করার আগে অবশ্যই তা ঘোষণা করতে হবে।
class foo {};
হয় একটি বর্গ সংজ্ঞা , তাই না?
C99 স্ট্যান্ডার্ড থেকে, 6.7 (5):
একটি ঘোষণাপত্র শনাক্তকারীদের একটি সেটের ব্যাখ্যা এবং বৈশিষ্ট্য নির্দিষ্ট করে। সনাক্তকারী একটি সংজ্ঞা যে সনাক্তকারী জন্য একটি ঘোষণা যে:
সি ++ স্ট্যান্ডার্ড থেকে, 3.1 (2):
একটি ঘোষণাকে একটি সংজ্ঞা বলা হয় যতক্ষণ না এটি ফাংশনটির বডি উল্লেখ না করে কোনও ফাংশন ঘোষণা করে না, এতে বাহ্যিক নির্দিষ্টকারী বা সংযোগ-নির্দিষ্টকরণ এবং কোনও আরম্ভকারী বা কোনও ফাংশন-বডি থাকে না, এটি শ্রেণীর ঘোষণায় স্থিতিশীল ডেটা সদস্য হিসাবে ঘোষণা করে, এটি একটি শ্রেণীর নাম ঘোষণা, বা এটি একটি টাইপডেফ ঘোষণা, একটি ব্যবহার-ঘোষণা, বা ব্যবহারের নির্দেশ।
তারপরে কিছু উদাহরণ রয়েছে।
খুব আকর্ষণীয়ভাবে (বা না, তবে আমি এটি থেকে কিছুটা অবাক হয়েছি), typedef int myint;
সি 99 এর একটি সংজ্ঞা, তবে সি ++ তে কেবল একটি ঘোষণা।
typedef
, এর অর্থ এই নয় যে এটি সি ++ এ পুনরাবৃত্তি করা যেতে পারে, তবে সি 99 তে নয়?
উইকি.অ্যান্সবার্স.কম থেকে:
ঘোষণার শব্দটির অর্থ (সি-তে) যে আপনি সংকলককে টাইপ, আকার এবং ফাংশন ঘোষণার ক্ষেত্রে, কোনও প্রোগ্রামের কোনও ভেরিয়েবলের পরামিতিগুলির টাইপ এবং আকার, বা আপনার প্রোগ্রামে ব্যবহারকারী সংজ্ঞায়িত টাইপ বা ফাংশন সম্পর্কে বলছেন। ঘোষণার ক্ষেত্রে কোনও পরিবর্তনশীলের জন্য মেমোরিতে কোনও স্থান সংরক্ষিত নেই । তবে সংকলক জানে যে এই ধরণের একটি ভেরিয়েবল তৈরি হওয়ার ক্ষেত্রে কতটা জায়গা সংরক্ষণ করতে হবে।
উদাহরণস্বরূপ, নিম্নলিখিত সমস্ত ঘোষণা রয়েছে:
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;
দেখতে উত্তরসমূহ ।
struct foo {};
এটি একটি সংজ্ঞা , ঘোষণা নয়। একটি ঘোষণা foo
হবে struct foo;
। এর থেকে, সংকলকটি জানে না যে কতগুলি foo
অবজেক্টের জন্য সংরক্ষণ করতে হবে।
struct foo;
এটি একটি ঘোষণা, তবে এটি কম্পাইলারকে ফু এর আকার বলে না। আমি struct _tagExample { int a; int b; };
এটি সংজ্ঞা যুক্ত করব। সুতরাং এই প্রসঙ্গে এটি ঘোষণাকে কল্পনা করা বিভ্রান্তিকর। অবশ্যই এটি একটি, যেহেতু সমস্ত সংজ্ঞা হ'ল ঘোষণা, তবে আপনি মনে করছেন যে এটি কোনও সংজ্ঞা নয়। এটি _ ট্যাগ ট্যাগের একটি সংজ্ঞা।
যেহেতু আমি এখানে সি ++ 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
সংজ্ঞা:
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);
}
int a; //declaration; a=10; //definition
এটি সম্পূর্ণ ভুল। স্বয়ংক্রিয় স্টোরেজ সময়কাল অবজেক্টের কথা বলার সময় (বাহ্যিকের মতো অন্য স্টোরেজ শ্রেণীর নির্দিষ্টকারীর সাথে ঘোষিত না হওয়া কোনও ফাংশন সংজ্ঞাটির অভ্যন্তরে ঘোষিত সামগ্রী) এগুলি সর্বদা সংজ্ঞা হয়।
চলতি নিয়ম:
একটি ঘোষণা সংকলককে মেমরিতে ভেরিয়েবলের ডেটা কীভাবে ব্যাখ্যা করতে হয় তা বলে। প্রতিটি অ্যাক্সেসের জন্য এটি প্রয়োজন।
একটি সংজ্ঞা পরিবর্তনশীল বিদ্যমান করতে মেমরি সংরক্ষণ করে। প্রথম অ্যাক্সেসের ঠিক আগে এটি ঘটতে হবে।
বিশেষ্যগুলি বুঝতে, প্রথমে ক্রিয়াগুলিতে ফোকাস করা যাক।
ডিক্লেয়ার - to আনুষ্ঠানিকভাবে ঘোষণা; বলুন
সংজ্ঞায়িত - পরিষ্কার বা সম্পূর্ণরূপে (কাউকে বা কিছু) প্রদর্শন বা বর্ণনা করতে
সুতরাং, যখন আপনি কিছু ঘোষণা করেন, আপনি কেবল এটি কী তা জানান ।
// declaration
int sum(int, int);
এই লাইনটি একটি সি ফাংশন ঘোষণা করেsum
যা দুটি ধরণের আর্গুমেন্ট নেয় int
এবং একটি প্রদান করে int
। তবে আপনি এটি এখনও ব্যবহার করতে পারবেন না।
আপনি যখন সরবরাহ করেন এটি আসলে কীভাবে কাজ করে , এটি এর সংজ্ঞা।
// definition
int sum(int x, int y)
{
return x + y;
}
ঘোষণা এবং সংজ্ঞা মধ্যে পার্থক্য বুঝতে আমাদের সমাবেশ কোড দেখতে হবে:
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)
ঘোষণায় কোনও সমতুল্য নির্দেশনা নেই কারণ এটি কার্যকর করার মতো কিছু নয়।
তদুপরি ঘোষণাপত্রটি কম্পাইলারকে ভেরিয়েবলের সুযোগ বলে।
আমরা বলতে পারি যে ঘোষণাপত্রটি চলকটির সঠিক ব্যবহার প্রতিষ্ঠার জন্য এবং কিছু স্মৃতি কতক্ষণ নির্দিষ্ট ভেরিয়েবলের সাথে সম্পর্কিত তা সংস্থার দ্বারা ব্যবহৃত তথ্য।
আপনি কি সর্বাধিক সাধারণ শর্তে বলতে পারেন যে ঘোষণাটি এমন একটি সনাক্তকারী যা কোনও স্টোরেজ বরাদ্দ করা হয় না এবং সংজ্ঞা আসলে ঘোষিত শনাক্তকারী থেকে স্টোরেজ বরাদ্দ করে?
একটি আকর্ষণীয় চিন্তা - শ্রেণী বা ফাংশন প্রকারের তথ্যের সাথে সংযুক্ত না হওয়া পর্যন্ত কোনও টেম্পলেট স্টোরেজ বরাদ্দ করতে পারে না। সুতরাং টেমপ্লেট সনাক্তকারী একটি ঘোষণা বা সংজ্ঞা? এটি কোনও ঘোষণা হতে হবে যেহেতু কোনও স্টোরেজ বরাদ্দ করা হয়নি, এবং আপনি কেবল টেম্পলেট শ্রেণি বা ফাংশনটি 'প্রোটোটাইপিং' করছেন।
template<class T> struct foo;
একটি টেম্পলেট ঘোষণা এবং এটিওtemplate<class T> void f();
। টেম্পলেট সংজ্ঞা একইভাবে আয়না শ্রেণি / ফাংশন সংজ্ঞা। (দ্রষ্টব্য যে কোনও টেম্পলেটটির নাম কোনও প্রকার বা ফাংশনের নাম নয় One আপনি যখন এটি দেখতে পাচ্ছেন এমন এক জায়গাটি যখন আপনি অন্য টেমপ্লেটের টাইপ প্যারামিটার হিসাবে কোনও টেম্পলেট পাস করতে পারবেন না you )
এখানে অনুরূপ উত্তরগুলি সন্ধান করুন: প্রযুক্তিগত সাক্ষাত্কারের প্রশ্নগুলি সি ।
একটি ঘোষণা প্রোগ্রামের একটি নাম সরবরাহ করে; একটি সংজ্ঞা প্রোগ্রামের মধ্যে একটি সত্তার (যেমন প্রকার, উদাহরণ এবং ফাংশন) এর অনন্য বর্ণনা সরবরাহ করে। ঘোষণাগুলি প্রদত্ত সুযোগে পুনরাবৃত্তি করা যেতে পারে, এটি প্রদত্ত সুযোগে একটি নাম প্রবর্তন করে।
একটি ঘোষণা একটি সংজ্ঞা হয় যতক্ষণ না:
সংজ্ঞাটি হ'ল ঘোষণা হিসাবে:
এটি সত্যই উদাসীন শোনায় তবে আমি শর্তগুলি সরাসরি আমার মাথায় রাখতে সক্ষম হয়েছি এটি সবচেয়ে ভাল উপায়:
ঘোষণা: ছবি টমাস জেফারসন একটি ভাষণ দিচ্ছেন ... "আমি এই সিদ্ধান্তটি গ্রহণ করি যে এই বিষয়টিকে এই উত্সের কোডে রয়েছে !!!"
সংজ্ঞা: একটি অভিধানের চিত্র দিন, আপনি ফু-র সন্ধান করছেন এবং এর প্রকৃত অর্থ।
জিএনইউ সি লাইব্রেরির ম্যানুয়াল অনুসারে ( http://www.gnu.org/software/libc/manual/html_node/Header-Files.html )
সি-তে একটি ঘোষণাপত্র কেবল এমন তথ্য সরবরাহ করে যা কোনও ফাংশন বা ভেরিয়েবল বিদ্যমান এবং তার প্রকারটি দেয়। কোনও কার্য ঘোষণার জন্য, এর আর্গুমেন্টগুলির ধরণের সম্পর্কেও তথ্য সরবরাহ করা যেতে পারে। ঘোষণার উদ্দেশ্য হ'ল সংকলকটিকে সঠিকভাবে ঘোষিত ভেরিয়েবল এবং ফাংশনগুলির রেফারেন্সগুলি প্রক্রিয়া করার অনুমতি দেওয়া। অন্যদিকে একটি সংজ্ঞা আসলে একটি ভেরিয়েবলের জন্য সঞ্চয়স্থান বরাদ্দ করে বা কোনও ফাংশন কী করে তা বলে।
আপনি বাহ্যিক স্টোরেজ ক্লাসটি ব্যবহার করার সময় ডিক্লেয়ারেশন এবং ডেফিনেশনের ধারণাটি একটি সমস্যার সৃষ্টি করবে কারণ আপনার সংজ্ঞাটি অন্য কোনও স্থানে থাকবে এবং আপনি আপনার স্থানীয় কোড ফাইলের (পৃষ্ঠা) ভেরিয়েবলটি ঘোষণা করছেন। সি এবং সি ++ এর মধ্যে একটি পার্থক্য হ'ল সিতে আপনি ঘোষণাগুলি কোনও ফাংশন বা কোড পৃষ্ঠার শুরুতে সাধারণত করা হয়। সি ++ এ এটির মতো নয়। আপনি আপনার পছন্দের জায়গায় ঘোষণা করতে পারেন।
আমার প্রিয় উদাহরণটি "ইনট নুম = 5" এখানে আপনার ভেরিয়েবলটি 1 টি সংজ্ঞায়িত করা হয়েছে 2 ইনট 2 হিসাবে ঘোষিত এবং 3. পাঁচটির মান সহ ইনস্ট্যান্টিয়েটেড। আমরা
কোনও শ্রেণি বা কাঠামো আপনাকে যখন পরে ব্যবহার করা হয় তখন কীভাবে সংজ্ঞা দেওয়া হবে তা পরিবর্তন করতে দেয়। উদাহরণ স্বরূপ
আমরা যখন প্রোগ্রামিং শিখি তখন এই দুটি পদটি প্রায়শই বিভ্রান্ত হয় কারণ আমরা প্রায়শই একই সময়ে একই সাথে করি।
সম্পাদনযোগ্য প্রজন্মের পর্যায়:
(1) প্রাক প্রসেসর -> (2) অনুবাদক / সংকলক -> (3) লিঙ্কার
দ্বিতীয় পর্যায়ে (অনুবাদক / সংকলক), আমাদের কোডে ঘোষণাপত্রের বিবৃতি সংকলককে বলে যে আমরা ভবিষ্যতে এই জিনিসগুলি ব্যবহার করতে যাচ্ছি এবং আপনি পরে সংজ্ঞা পেতে পারেন, অর্থ:
অনুবাদক নিশ্চিত করুন যে: কি? অর্থ ঘোষণা
এবং (3) পর্যায়ে (লিঙ্কার) জিনিসগুলি আবদ্ধ করার জন্য সংজ্ঞা প্রয়োজন
লিঙ্কার নিশ্চিত করুন যে: কোথায়? সংজ্ঞা
কে ওআর (২ য় সংস্করণ) জুড়ে ছড়িয়ে দেওয়া কিছু খুব স্পষ্ট সংজ্ঞা রয়েছে; এটি সেগুলিকে এক জায়গায় রাখতে এবং সেগুলি এক হিসাবে পড়তে সহায়তা করে:
"সংজ্ঞা" সেই স্থানটিকে বোঝায় যেখানে ভেরিয়েবলটি তৈরি করা হয় বা নির্ধারিত স্টোরেজ দেওয়া হয়; "ঘোষণা" সেই স্থানগুলিকে বোঝায় যেখানে ভেরিয়েবলের প্রকৃতি বর্ণিত হয় তবে কোনও স্টোরেজ বরাদ্দ করা হয় না। [পৃ। 33]
...
বাহ্যিক ভেরিয়েবলের ঘোষণাপত্র এবং এর সংজ্ঞা মধ্যে পার্থক্য করা গুরুত্বপূর্ণ । একটি ঘোষণাপত্র একটি ভেরিয়েবলের বৈশিষ্ট্য ঘোষণা করে (প্রাথমিকভাবে এটির ধরণ); একটি সংজ্ঞা এছাড়াও স্টোরেজ পৃথক করা কারণ। লাইন থাকলে
int sp; double val[MAXVAL]
যে কোনও ফাংশনের বাইরে উপস্থিত হয়ে তারা বাহ্যিক ভেরিয়েবলগুলি সংজ্ঞায়িত করে
sp
এবংval
স্টোরেজকে আলাদা করে রাখে এবং সেই উত্স ফাইলের বাকী অংশের ঘোষণার কাজ করে।অন্যদিকে, লাইনগুলি
extern int sp; extern double val[];
বাকি উত্স ফাইলের জন্য ঘোষণা করুন যা
sp
একটিint
এবং এটিval
একটিdouble
অ্যারে (যার আকার অন্যত্র নির্ধারিত হয়) তবে তারা ভেরিয়েবলগুলি তৈরি করে না বা তাদের জন্য সঞ্চয়স্থান সংরক্ষণ করে না।উত্স প্রোগ্রামটি তৈরি করা সমস্ত ফাইলের মধ্যে একটি বাহ্যিক ভেরিয়েবলের কেবল একটি সংজ্ঞা থাকতে হবে । ... অ্যারে মাপগুলি সংজ্ঞা সহ নির্দিষ্ট করা আবশ্যক তবে এটি একটি সহ alচ্ছিক
extern
ঘোষণার optionচ্ছিক। [পিপি। 80-81]...
ঘোষণাগুলি প্রতিটি সনাক্তকারীকে প্রদত্ত ব্যাখ্যা নির্দিষ্ট করে; এগুলি শনাক্তকারীর সাথে জড়িত স্টোরেজ অগত্যা সংরক্ষণ করে না। রিজার্ভ স্টোরেজ যে ঘোষণাগুলি সংজ্ঞা বলা হয় । [পৃ। 210]
ঘোষণার অর্থ একটি ভেরিয়েবলের নাম এবং প্রকার (ভেরিয়েবল ঘোষণার ক্ষেত্রে) টাইপ করুন, যেমন:
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()
।
int x;