টাইপডেফ এবং # ডিফাইন সি তে কি একই?


উত্তর:


122

না।

#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 */

3
টাইপডেফের পরে stdfx, এই ধরণের বৈধ অবজেক্টগুলি এমন ক্রিয়াকলাপগুলিতে পয়েন্টার হয় যা কোনও int প্রাপ্ত হয় এবং কোনও মান ফেরত দেয় না।
পিএমজি

1
যুক্তি হিসাবে ফাংশন পয়েন্টারের ক্ষেত্রে # ডিফাইন ব্যর্থ হবে কেন?
আল্লাহজানে

2
@ আল্লাহজানে: সম্প্রসারণ হয়ে যায় void fx_def(void (*)(int) fx);; সঠিক ঘোষণাটি হ'ল void fx_def(void (*fx)(int));
পিএমজি 10

5
ফাংশন পয়েন্টার ম্যাক্রো সঙ্গে করা সম্ভব হয়, শুধুমাত্র আপনি বাক্য গঠন ছেড়ে দিতে হবে করার জন্য প্রস্তুত হন: #define FX_TYPE(f) void (*f)(int)। তারপরে আপনি নিজের ফাংশনটি এভাবে ঘোষণা করবেন:void fx_def(FX_TYPE(fx));
প্লাফার করুন

229

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

23

না, তারা এক নয়। উদাহরণ স্বরূপ:

#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

প্রিপ্রোসেসর ম্যাক্রো দিয়ে এটি করার চেষ্টা করুন।


13

# ডেফাইন ম্যাক্রো সংজ্ঞায়িত করে।
টাইপডেফ প্রকারগুলি সংজ্ঞায়িত করে।

এখন বলছি যে এখানে কয়েকটি পার্থক্য রয়েছে:

# ডিফাইন দিয়ে আপনি ধ্রুবকগুলি সংজ্ঞায়িত করতে পারেন যা সংকলনের সময় ব্যবহার করা যেতে পারে। ধ্রুবক ব্যবহার করা যেতে পারে #ifdef পরীক্ষা কিভাবে কোড কম্পাইল করা হয়, এবং কম্পাইল পরামিতি অনুযায়ী নির্দিষ্ট কোড বিশেষজ্ঞ করতে।
আপনি ম্যাক্রো ফাংশনগুলিকে ক্ষুদ্রতর সন্ধান এবং প্রতিস্থাপনের জন্য # ডেফাইন ব্যবহার করতে পারেন ।

টাইপিডেফকে প্রকারকে উপকরণ দেওয়ার জন্য ব্যবহার করা যেতে পারে (যা আপনি সম্ভবত # ডিফাইন দিয়েও করতে পারেন ) তবে এটি নিরাপদ # ডিফাইন কনস্ট্যান্টগুলির সন্ধান এবং প্রতিস্থাপনের প্রকৃতির কারণে ।
কেবল তাই নয়, আপনি ব্যবহার করতে পারেন এগিয়ে ঘোষণা দিয়ে হয় typedef আপনি একটি টাইপ যে ব্যবহার করা হবে ঘোষণা করতে পারবেন, কিন্তু এখনো আপনি যে ফাইলটি মধ্যে লেখার লিঙ্ক করা হয় না।


# ডিফাইন প্রকৃতিটি সন্ধান এবং প্রতিস্থাপনের অর্থ কী? , আপনাকে ধন্যবাদ
মোহাম্মদ এল শেনাভি

1
এর অর্থ সংকলনের আগে, প্রিপ্রোসেসর সমস্ত ম্যাক্রোগুলি সন্ধান করবে এবং তাদের মূল সিনট্যাক্সের সাথে প্রতিস্থাপন করবে
যুবরাজ বিজয় প্রতাপ

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

8

প্রিপ্রসেসর ম্যাক্রোস (" #define's") একটি লেজিকাল রিপ্লেসমেন্ট সরঞ্জাম একটি লা "অনুসন্ধান এবং প্রতিস্থাপন"। এগুলি সম্পূর্ণরূপে প্রোগ্রামিং ভাষার অজ্ঞানী এবং আপনি কী করার চেষ্টা করছেন তা কিছুই বুঝতে পারে না। আপনি এগুলিকে গৌরবযুক্ত অনুলিপি / পেস্ট মেকানিক হিসাবে ভাবতে পারেন - মাঝে মাঝে এটি দরকারী তবে আপনার এটি যত্ন সহ ব্যবহার করা উচিত।

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

(3) এর জন্য: যখন সম্ভব হয় তখন আপনার প্রিপ্রসেসর ম্যাক্রোগুলির চেয়ে ভাষা বৈশিষ্ট্যগুলি সর্বদা পছন্দ করা উচিত! সুতরাং সর্বদা টাইপের জন্য টাইপডেফ এবং ধ্রুবকগুলির জন্য ধ্রুবক মান ব্যবহার করুন। এইভাবে, সংকলকটি আসলে আপনার সাথে অর্থপূর্ণভাবে ইন্টারেক্ট করতে পারে। মনে রাখবেন যে সংকলকটি আপনার বন্ধু, তাই আপনার এটি যতটা সম্ভব বলা উচিত। প্রিপ্রোসেসর ম্যাক্রোগুলি সংক্ষেপক থেকে আপনার শব্দার্থকগুলি লুকিয়ে রেখে ঠিক বিপরীতে করেন।


আপনি কি সি ++ তে একটি উদাহরণ বলতে পারেন যেখানে আপনাকে কোনও টাইপ টাইপ করতে হবে? আমি শুধু এটি সম্পর্কে কৌতূহল।
জাইজ

@ জাইজুজ: আপনি যদি কোনও সদস্য ফাংশন ফাংশন পয়েন্টারগুলির একটি অ্যারে, বা এর মতো কিছু ফিরিয়ে দিতে চান তবে এমন কিছু আছে - আপনি যদি টাইপটি বানান চেষ্টা করেন, জিসিসি আসলে বলেছে "আপনাকে অবশ্যই একটি টাইপডেফ ব্যবহার করতে হবে"।
কেরেক এসবি

4

এগুলি খুব আলাদা, যদিও এগুলি প্রায়শই কাস্টম ডেটা প্রকারগুলি প্রয়োগ করতে ব্যবহৃত হয় (যা আমি এই প্রশ্নটি ধরে নিচ্ছি এটিই সমস্ত)।

এমএমজি উল্লিখিত হিসাবে, সংকলকটি কোডটি দেখার #defineআগে প্রাক-প্রসেসর (কাট-পেস্ট অপারেশনের মতো) typedefদ্বারা পরিচালিত হয় এবং সংকলক দ্বারা ব্যাখ্যা করা হয়।

প্রধান পার্থক্যগুলির মধ্যে একটি (অন্তত যখন এটি ডেটা সংজ্ঞায়িত করার ক্ষেত্রে আসে) এটি typedefআরও নির্দিষ্ট ধরণের পরীক্ষার জন্য অনুমতি দেয়। উদাহরণ স্বরূপ,

#define defType int
typedef int tdType

defType x;
tdType y;

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

এছাড়াও, কিছু ডিবাগারগুলির মধ্যে typedefগুলি পরিচালনা করার ক্ষমতা রয়েছে , যা সমস্ত কাস্টম প্রকারকে তাদের অন্তর্নিহিত আদিম ধরণের তালিকাভুক্ত করার চেয়ে বেশি কার্যকর হতে পারে (এটি যদি #defineপরিবর্তে ব্যবহৃত হয় তবে তা হবে)।


2

না।
টাইপিডেফ একটি সি কীওয়ার্ড যা কোনও প্রকারের জন্য একটি উপাস তৈরি করে।
# ডেফাইন একটি প্রাক প্রসেসর নির্দেশ, যা সংকলনের পূর্বে একটি পাঠ্য প্রতিস্থাপন ইভেন্ট তৈরি করে। সংকলক কোডটি পেয়ে গেলে মূল "# সংজ্ঞায়িত" শব্দটি আর থাকবে না। # ডেফাইন বেশিরভাগ ক্ষেত্রে ম্যাক্রো এবং গ্লোবাল ধ্রুবকগুলির জন্য ব্যবহৃত হয়।


2
"পয়েন্টার" শব্দটির ব্যবহার এখানে কিছু বিভ্রান্তির কারণ হতে পারে।

একমত। এ কারণেই আমি ফিরে গিয়ে এমএসডিএন-তে টাইপফের লিঙ্ক যুক্ত করেছি - ভবিষ্যতে যে কেউ টাইপেইফ কী তা এই সন্ধান করতে এই প্রশ্নটি ব্যবহার করবে। তবে সম্ভবত আমার এই শব্দটি পরিবর্তন করা উচিত ...
ট্র্যাভেলিং টেক গাই

2

আফাইক, না

typedefআপনাকে একটি বিদ্যমান উপাত্তের জন্য একটি "উপনাম" সেট আপ করতে সহায়তা করে। যেমন যেমন typedef char chr;

#defineম্যাক্রো বা সাধারণ প্যাটার্নের বিকল্পগুলি সংজ্ঞায়িত করতে ব্যবহৃত একটি প্রিপ্রোসেসর নির্দেশিকা। যেমন যেমন #define MAX 100, MAX100 এর সমস্ত উপস্থিতি প্রতিস্থাপন করে


0

উপরে উল্লিখিত হিসাবে, #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;

আপেল এবং কলা উভয়কেই এক হিসাবে ঘোষণা করে। সামনের নামটি আলাদা, তবে তারা উভয়ই একটি চরের পয়েন্টার।


-1

সবাই যেমন উপরে বলেছে, তারা এক নয়। বেশিরভাগ উত্তরই এর typedefচেয়ে বেশি সুবিধাজনক বলে ইঙ্গিত দেয় #define। তবে আমাকে এর একটি প্লাস পয়েন্ট রাখতে দাও #define:
যখন আপনার কোডটি অত্যন্ত বড়, অনেকগুলি ফাইল জুড়ে ছড়িয়ে ছিটিয়ে থাকে তখন এটি ব্যবহার করা ভাল #define; এটি পঠনযোগ্যতায় সহায়তা করে - আপনি কেবলমাত্র তার ঘোষণার জায়গায় পরিবর্তকের আসল ধরণের সংজ্ঞা দেখতে সমস্ত কোড প্রিপ্রসেস করতে পারেন।

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