উত্তর:
না।
#define
এটি একটি প্রিপ্রোসেসর টোকেন: সংকলক নিজে কখনও এটি দেখতে পাবে না।
typedef
এটি একটি সংকলক টোকেন: প্রিপ্রোসেসর এটি যত্ন করে না।
আপনি একই প্রভাব অর্জন করতে এক বা অন্যটিকে ব্যবহার করতে পারেন তবে আপনার প্রয়োজনের জন্য যথাযথটি ব্যবহার করা ভাল
#define MY_TYPE int
typedef int My_Type;
জিনিসগুলি যখন "লোমশ" হয়, তখন উপযুক্ত সরঞ্জামটি ব্যবহার করা এটি সঠিক করে তোলে
#define FX_TYPE void (*)(int)
typedef void (*stdfx)(int);
void fx_typ(stdfx fx); /* ok */
void fx_def(FX_TYPE fx); /* error */
void fx_def(void (*)(int) fx);
; সঠিক ঘোষণাটি হ'ল void fx_def(void (*fx)(int));
।
#define FX_TYPE(f) void (*f)(int)
। তারপরে আপনি নিজের ফাংশনটি এভাবে ঘোষণা করবেন:void fx_def(FX_TYPE(fx));
typedef
ভেরিয়েবলের মতো স্কোপিং বিধিগুলি মান্য করে, যেখানে define
সংকলন ইউনিটের শেষ না হওয়া পর্যন্ত (বা কোনও মিল না হওয়া পর্যন্ত undef
) বৈধ থাকে ।
এছাড়াও, কিছু জিনিস এটি দিয়ে করা যায় typedef
যা দিয়ে কাজ করা যায় না define
।
উদাহরণ স্বরূপ:
typedef int* int_p1;
int_p1 a, b, c; // a, b, c are all int pointers
#define int_p2 int*
int_p2 a, b, c; // only the first is a pointer, because int_p2
// is replaced with int*, producing: int* a, b, c
// which should be read as: int *a, b, c
typedef int a10[10];
a10 a, b, c; // create three 10-int arrays
typedef int (*func_p) (int);
func_p fp; // func_p is a pointer to a function that
// takes an int and returns an int
না, তারা এক নয়। উদাহরণ স্বরূপ:
#define INTPTR int*
...
INTPTR a, b;
প্রিপ্রোসেসিংয়ের পরে, সেই লাইনটি প্রসারিত হয়
int* a, b;
আশা করি সমস্যাটি দেখবেন; শুধুমাত্র a
টাইপ থাকবে int *
; b
একটি সমতলে ঘোষিত হবে int
(কারণ *
এটি ঘোষকের সাথে সম্পর্কিত, প্রকারের নির্দিষ্টকারীর সাথে নয়)।
এর সাথে বৈসাদৃশ্য করুন
typedef int *INTPTR;
...
INTPTR a, b;
এই ক্ষেত্রে, উভয় a
এবং b
টাইপ হবে int *
।
টাইপইফসের পুরো ক্লাস রয়েছে যা প্রিপ্রোসেসর ম্যাক্রো দিয়ে অনুকরণ করা যায় না, যেমন ফাংশন বা অ্যারেগুলিতে নির্দেশক:
typedef int (*CALLBACK)(void);
typedef int *(*(*OBNOXIOUSFUNC)(void))[20];
...
CALLBACK aCallbackFunc; // aCallbackFunc is a pointer to a function
// returning int
OBNOXIOUSFUNC anObnoxiousFunc; // anObnoxiousFunc is a pointer to a function
// returning a pointer to a 20-element array
// of pointers to int
প্রিপ্রোসেসর ম্যাক্রো দিয়ে এটি করার চেষ্টা করুন।
# ডেফাইন ম্যাক্রো সংজ্ঞায়িত করে।
টাইপডেফ প্রকারগুলি সংজ্ঞায়িত করে।
এখন বলছি যে এখানে কয়েকটি পার্থক্য রয়েছে:
# ডিফাইন দিয়ে আপনি ধ্রুবকগুলি সংজ্ঞায়িত করতে পারেন যা সংকলনের সময় ব্যবহার করা যেতে পারে। ধ্রুবক ব্যবহার করা যেতে পারে #ifdef পরীক্ষা কিভাবে কোড কম্পাইল করা হয়, এবং কম্পাইল পরামিতি অনুযায়ী নির্দিষ্ট কোড বিশেষজ্ঞ করতে।
আপনি ম্যাক্রো ফাংশনগুলিকে ক্ষুদ্রতর সন্ধান এবং প্রতিস্থাপনের জন্য # ডেফাইন ব্যবহার করতে পারেন ।
টাইপিডেফকে প্রকারকে উপকরণ দেওয়ার জন্য ব্যবহার করা যেতে পারে (যা আপনি সম্ভবত # ডিফাইন দিয়েও করতে পারেন ) তবে এটি নিরাপদ # ডিফাইন কনস্ট্যান্টগুলির সন্ধান এবং প্রতিস্থাপনের প্রকৃতির কারণে ।
কেবল তাই নয়, আপনি ব্যবহার করতে পারেন এগিয়ে ঘোষণা দিয়ে হয় typedef আপনি একটি টাইপ যে ব্যবহার করা হবে ঘোষণা করতে পারবেন, কিন্তু এখনো আপনি যে ফাইলটি মধ্যে লেখার লিঙ্ক করা হয় না।
প্রিপ্রসেসর ম্যাক্রোস (" #define
's") একটি লেজিকাল রিপ্লেসমেন্ট সরঞ্জাম একটি লা "অনুসন্ধান এবং প্রতিস্থাপন"। এগুলি সম্পূর্ণরূপে প্রোগ্রামিং ভাষার অজ্ঞানী এবং আপনি কী করার চেষ্টা করছেন তা কিছুই বুঝতে পারে না। আপনি এগুলিকে গৌরবযুক্ত অনুলিপি / পেস্ট মেকানিক হিসাবে ভাবতে পারেন - মাঝে মাঝে এটি দরকারী তবে আপনার এটি যত্ন সহ ব্যবহার করা উচিত।
টাইপিডেফস একটি সি ভাষার বৈশিষ্ট্য যা আপনাকে প্রকারের জন্য উপকরণ তৈরি করতে দেয়। জটিল যৌগিক ধরণের (স্ট্রাক্ট এবং ফাংশন পয়েন্টারগুলির মতো) পাঠযোগ্য এবং হ্যান্ডলেবল (সি ++ তে এমন কিছু পরিস্থিতি রয়েছে যেখানে আপনাকে কোনও টাইপ টাইপ করতে হবে ) তৈরি করতে এটি অত্যন্ত কার্যকর ।
(3) এর জন্য: যখন সম্ভব হয় তখন আপনার প্রিপ্রসেসর ম্যাক্রোগুলির চেয়ে ভাষা বৈশিষ্ট্যগুলি সর্বদা পছন্দ করা উচিত! সুতরাং সর্বদা টাইপের জন্য টাইপডেফ এবং ধ্রুবকগুলির জন্য ধ্রুবক মান ব্যবহার করুন। এইভাবে, সংকলকটি আসলে আপনার সাথে অর্থপূর্ণভাবে ইন্টারেক্ট করতে পারে। মনে রাখবেন যে সংকলকটি আপনার বন্ধু, তাই আপনার এটি যতটা সম্ভব বলা উচিত। প্রিপ্রোসেসর ম্যাক্রোগুলি সংক্ষেপক থেকে আপনার শব্দার্থকগুলি লুকিয়ে রেখে ঠিক বিপরীতে করেন।
এগুলি খুব আলাদা, যদিও এগুলি প্রায়শই কাস্টম ডেটা প্রকারগুলি প্রয়োগ করতে ব্যবহৃত হয় (যা আমি এই প্রশ্নটি ধরে নিচ্ছি এটিই সমস্ত)।
এমএমজি উল্লিখিত হিসাবে, সংকলকটি কোডটি দেখার #define
আগে প্রাক-প্রসেসর (কাট-পেস্ট অপারেশনের মতো) typedef
দ্বারা পরিচালিত হয় এবং সংকলক দ্বারা ব্যাখ্যা করা হয়।
প্রধান পার্থক্যগুলির মধ্যে একটি (অন্তত যখন এটি ডেটা সংজ্ঞায়িত করার ক্ষেত্রে আসে) এটি typedef
আরও নির্দিষ্ট ধরণের পরীক্ষার জন্য অনুমতি দেয়। উদাহরণ স্বরূপ,
#define defType int
typedef int tdType
defType x;
tdType y;
এখানে, সংকলকটি ভেরিয়েবল এক্সকে একটি আন্ত হিসাবে দেখায়, তবে ভেরিয়েবল ওয়াকে 'টাইডিটাইপ' নামক একটি ডেটা টাইপ হিসাবে দেখায় যা কোনও ইন্টির মতো একই আকারে ঘটে। আপনি যদি এমন কোনও ফাংশন লিখেছিলেন যা ডিফটাইপ টাইপের একটি প্যারামিটার নিয়ে থাকে তবে কলার একটি সাধারণ ইনট পাস করতে পারে এবং সংকলক পার্থক্যটি জানত না। যদি ফাংশন পরিবর্তে টিডিটাইপ টাইপের একটি প্যারামিটার গ্রহণ করে তবে সংকলকটি নিশ্চিত করবে যে ফাংশন কল করার সময় সঠিক টাইপের একটি চলক ব্যবহৃত হয়েছিল।
এছাড়াও, কিছু ডিবাগারগুলির মধ্যে typedef
গুলি পরিচালনা করার ক্ষমতা রয়েছে , যা সমস্ত কাস্টম প্রকারকে তাদের অন্তর্নিহিত আদিম ধরণের তালিকাভুক্ত করার চেয়ে বেশি কার্যকর হতে পারে (এটি যদি #define
পরিবর্তে ব্যবহৃত হয় তবে তা হবে)।
না।
টাইপিডেফ একটি সি কীওয়ার্ড যা কোনও প্রকারের জন্য একটি উপাস তৈরি করে।
# ডেফাইন একটি প্রাক প্রসেসর নির্দেশ, যা সংকলনের পূর্বে একটি পাঠ্য প্রতিস্থাপন ইভেন্ট তৈরি করে। সংকলক কোডটি পেয়ে গেলে মূল "# সংজ্ঞায়িত" শব্দটি আর থাকবে না। # ডেফাইন বেশিরভাগ ক্ষেত্রে ম্যাক্রো এবং গ্লোবাল ধ্রুবকগুলির জন্য ব্যবহৃত হয়।
আফাইক, না
typedef
আপনাকে একটি বিদ্যমান উপাত্তের জন্য একটি "উপনাম" সেট আপ করতে সহায়তা করে। যেমন যেমন typedef char chr
;
#define
ম্যাক্রো বা সাধারণ প্যাটার্নের বিকল্পগুলি সংজ্ঞায়িত করতে ব্যবহৃত একটি প্রিপ্রোসেসর নির্দেশিকা। যেমন যেমন #define MAX 100
, MAX
100 এর সমস্ত উপস্থিতি প্রতিস্থাপন করে
উপরে উল্লিখিত হিসাবে, #define
টাইপডেফ এবং টাইপফের মধ্যে একটি মূল পার্থক্য রয়েছে । এ সম্পর্কে ভাবার সঠিক উপায়টি হল একটি টাইপডিফকে সম্পূর্ণ "এনক্যাপসুলেটেড" প্রকার হিসাবে দেখা। এর অর্থ হল যে আপনি এটি ঘোষণার পরে আপনি এতে যুক্ত করতে পারবেন না।
আপনি অন্য ধরণের স্পেসিফায়ার্স সহ ম্যাক্রো টাইপনেম প্রসারিত করতে পারেন, তবে কোনও টাইপডেফ টাইপনেম নয়:
#define fruit int
unsigned fruit i; // works fine
typedef int fruit;
unsigned fruit i; // illegal
এছাড়াও, টাইপডেফ নাম একটি ঘোষণায় প্রতিটি ঘোষণাকারীর জন্য টাইপ সরবরাহ করে।
#define fruit int *
fruit apple, banana;
ম্যাক্রো প্রসারণের পরে, দ্বিতীয় লাইনটি হয়ে যায়:
int *apple, banana;
অ্যাপল একটি ইনট এর পয়েন্টার, অন্যদিকে কলা একটি অন্তর্নিহিত। তুলনা করলে. টাইপয়েফ এর মতো:
typedef char *fruit;
fruit apple, banana;
আপেল এবং কলা উভয়কেই এক হিসাবে ঘোষণা করে। সামনের নামটি আলাদা, তবে তারা উভয়ই একটি চরের পয়েন্টার।
সবাই যেমন উপরে বলেছে, তারা এক নয়। বেশিরভাগ উত্তরই এর typedef
চেয়ে বেশি সুবিধাজনক বলে ইঙ্গিত দেয় #define
। তবে আমাকে এর একটি প্লাস পয়েন্ট রাখতে দাও #define
:
যখন আপনার কোডটি অত্যন্ত বড়, অনেকগুলি ফাইল জুড়ে ছড়িয়ে ছিটিয়ে থাকে তখন এটি ব্যবহার করা ভাল #define
; এটি পঠনযোগ্যতায় সহায়তা করে - আপনি কেবলমাত্র তার ঘোষণার জায়গায় পরিবর্তকের আসল ধরণের সংজ্ঞা দেখতে সমস্ত কোড প্রিপ্রসেস করতে পারেন।
stdfx
, এই ধরণের বৈধ অবজেক্টগুলি এমন ক্রিয়াকলাপগুলিতে পয়েন্টার হয় যা কোনও int প্রাপ্ত হয় এবং কোনও মান ফেরত দেয় না।