#If 0… #endif ব্লকটি ঠিক কী করে?


124

ইন সি / সি ++

একটি #if 0/ #endifব্লকের মধ্যে স্থাপন কোড কি হবে ?

#if 0

//Code goes here

#endif

কোডটি কি কেবল এড়িয়ে যায় এবং তাই কার্যকর হয় না?


17
এটি একটি কৌশল যা প্রচুর পরিমাণে কোড মন্তব্য করতে বা কোডের ব্লকগুলিকে অন্তর্ভুক্তির পরীক্ষার অনুমতি দেওয়ার জন্য ব্যবহৃত হয়। এই বৈশিষ্ট্যটি ব্যতীত একজনকে প্রতিটি লাইনকে উপসর্গ করতে হবে //বা বিভাগটি দিয়ে শুরু করতে হবে /*এবং এর সাথে বিভাগটি শেষ করতে হবে */। পরবর্তী কৌশলগুলির সাথে সমস্যাটি হ'ল মন্তব্যটি বাসা বাঁধে না তাই বিকাশকারীকে অবশ্যই */শুরু এবং শেষের মধ্যে কোনওটি চেক এবং পরিচালনা করতে হবে ।
টমাস ম্যাথিউ

উত্তর:


141

এটি কেবল কার্যকর হয় না, এটি সংকলিতও হয় না।

#ifহ'ল একটি প্রিপ্রোসেসর কমান্ড, যা প্রকৃত সংকলনের পদক্ষেপের আগে মূল্যায়ন করে। সেই ব্লকের অভ্যন্তরীণ কোডটি সংকলিত বাইনারিটিতে উপস্থিত হয় না।

এটি প্রায়শই সাময়িকভাবে কোডগুলির সেগমেন্টগুলি পরে আবার চালু করার অভিপ্রায়গুলির সাথে সরাতে ব্যবহৃত হয়।


1
এটি কোনও ধরণের মন্তব্যেই সত্য। গুরুত্বপূর্ণ পার্থক্য বাসা বাঁধাই।
স্যামি বেঞ্চেরিফ

73

একটি গুরুত্বপূর্ণ পার্থক্য ছাড়া ব্লকটি মন্তব্য করার জন্য এটি অভিন্ন: নেস্টিং কোনও সমস্যা নয়। এই কোডটি বিবেচনা করুন:

foo();
bar(x, y); /* x must not be NULL */
baz();

আমি যদি এটির মন্তব্য করতে চাই তবে আমি চেষ্টা করতে পারি:

/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/

Bzzt। বাক্যগঠন ত্রুটি! কেন? কারণ ব্লক মন্তব্যগুলি বাসা বাঁধে না এবং তাই (যেমন আপনি এসও এর সিনট্যাক্স হাইলাইট করে দেখতে পাচ্ছেন) */"NULL" শব্দটি মন্তব্যটি সমাপ্ত করে, bazকলটি কমেন্ট না করে এবং সিনট্যাক্স ত্রুটির */পরে তৈরি করে baz। অন্য দিকে:

#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif

পুরো জিনিস মন্তব্য করার জন্য কাজ করে। এবং #if 0এস একে অপরের সাথে বাসা বাঁধবে, এর মতো:

#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif

যদিও অবশ্যই এটি কিছুটা বিভ্রান্তি পেতে পারে এবং সঠিকভাবে মন্তব্য না করা হলে রক্ষণাবেক্ষণের মাথা ব্যাথা হয়ে যায়।


5
কেবলমাত্র নোট করুন যে # আইফের অভ্যন্তরে কোডটি বর্ণিতভাবে সঠিক হতে হবে (মন্তব্যের বিপরীতে) এবং প্রিপ্রসেসর নির্দেশিকা এখনও কার্যকর (ডাইটো)।
jpalecek

@ ডেভিড: এটি সঠিকভাবে সঠিক নয় তবে এটি এখনও সংকলন করবে। সুতরাং কোডটি সঠিকভাবে সঠিক হতে হবে না।
ডেনিস জিকিফুজ

1
@ ডেনিস, আমি জিসিসি foo.c:3: unterminated string or character constantথেকে পেয়েছি, আপনি কী ব্যবহার করছেন?
ডেভিড এক্স

18

এটি স্থায়ীভাবে সেই কোডটিকে মন্তব্য করে যাতে সংকলক কখনই এটি সংকলন করে না।

কোডার পরে চাইলে প্রোগ্রামটি কোড সংকলন করতে # আইডিডিএফ পরিবর্তন করতে পারে।

এটি ঠিক কোডটির অস্তিত্বের মতো নয়।


15

#If 0… #endif ব্লকটি ঠিক কী করে?

এটি আপনাকে বলে যে লেখক স্পষ্টতই কোনও সংস্করণ নিয়ন্ত্রণ ব্যবস্থা সম্পর্কে শুনেনি। যার ফলে, আপনাকে যতদূর সম্ভব দৌড়ে যেতে বলে ...


12

আমি #elseমামলার জন্য যুক্ত করতে চাই :

#if 0
   /* Code here will NOT be complied. */
#else
   /* Code will be compiled. */
#endif


#if 1
   /* Code will be complied. */
#else
   /* Code will NOT be compiled. */
#endif

7

প্রিপ্রোসেসর # যদি দেখেন তবে পরের টোকেনটির একটি শূন্য-মান আছে কিনা তা পরীক্ষা করে। এটি যদি করে তবে এটি সংকলকের জন্য কোডটি প্রায় রাখে। যদি এটি না হয় তবে এটি সেই কোড থেকে মুক্তি পেয়ে যায় তাই সংকলকটি কখনই এটি দেখে না।

যদি কেউ #if 0 বলেন তবে তারা কার্যকরভাবে কোডটি মন্তব্য করছেন যাতে এটি কখনই সংকলিত হবে না। আপনি এটিকে একইভাবে ভাবতে পারেন যেমন তারা / * ... * / এটি চারপাশে রেখেছিল। এটি একেবারে এক নয়, তবে এটির একই প্রভাব রয়েছে।

বিস্তারিত কী ঘটেছিল তা যদি আপনি বুঝতে চান তবে আপনি প্রায়শই দেখতে পারেন। অনেক সংকলক প্রিপ্রসেসর চালুর পরে আপনাকে ফাইলগুলি দেখতে দেয়। উদাহরণস্বরূপ, ভিজ্যুয়াল সি ++ এ স্যুইচ / পি কমান্ড প্রিপ্রসেসরটি কার্যকর করবে এবং ফলাফলগুলি একটি .i ফাইলে রাখবে।


বেশ না। প্রিপ্রসেসর টোকেন না করে লাইনে পার্স করে। আপনার ব্যাখ্যা অনুসারে উদাহরণ বলা সম্ভব হবে না #if WIN32 || __CYGWIN__তবে এটি প্রত্যাশার মতো কাজ করে।
বেন ভয়েগট

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

3

একটি দিয়ে শুরু লাইনস #হয় প্রাক প্রসেসর নির্দেশনা#if 0 [...] #endifব্লকগুলি এটি সংকলক করে না এবং কোনও মেশিন কোড উত্পন্ন করবে না।

উত্স ফাইলের মাধ্যমে প্রিপ্রোসেসর দিয়ে যা ঘটে তা আপনি প্রদর্শিত করতে পারেন ifdef.cxx:

#if 0
This code will not be compiled
#else
int i = 0;
#endif

চলমান gcc -E ifdef.cxx আপনাকে কী সংকলিত হবে তা দেখাবে।

উন্নয়ন চক্র চলাকালীন কোডের কোনও ব্লক সংকলিত হওয়া রোধ করতে আপনি এই প্রক্রিয়াটি ব্যবহার করতে পারেন তবে আপনি সম্ভবত এটি আপনার উত্স নিয়ন্ত্রণে পরীক্ষা করতে চান না কারণ এটি কেবল আপনার কোডটিতে ক্রাফ্ট যুক্ত করে এবং পাঠযোগ্যতা হ্রাস করে। যদি এটি কোডের একটি historicalতিহাসিক টুকরো যা মন্তব্য করা হয়েছে, তবে এটি অপসারণ করা উচিত: উত্স নিয়ন্ত্রণে ইতিহাস রয়েছে, তাই না?

এছাড়াও, উত্তর সি এবং সি ++ উভয়ের ক্ষেত্রে একই হতে পারে তবে সি / সি ++ নামে কোনও ভাষা নেই এবং এ জাতীয় ভাষার উল্লেখ করা ভাল অভ্যাস নয়।


4
"সি বা সি ++" এর শর্টহ্যান্ড হিসাবে সি / সি ++ বলার ক্ষেত্রে কী ভুল? আপনি কি সত্যিই মনে করেন যে "সি / সি ++" নামে একটি ভাষা আছে এমন ভেবে কেউ বিভ্রান্ত হতে চলেছে?
ক্রিস্টোফার বারবার

1
@ ক্রিস: লোকেরা প্রতিনিয়ত "সি / সি ++ তে এক্স কী করে?" এর মতো প্রশ্ন জিজ্ঞাসা করে? যা একটি অযৌক্তিক প্রশ্ন; আপনি একটি বা অন্যটিতে কোডিং করছেন, এবং আপনি যদি এখনও চয়ন না করেন তবে আপনাকে সেই সত্যে স্পষ্ট করা উচিত। সুতরাং, হ্যাঁ, "C / C ++" নামক একটি ভাষা থাকার বিষয়ে লোকেরা বিভ্রান্ত রয়েছে
ডেনিস জিকফুজ্জ

1
কী অযৌক্তিক বক্তব্য! এমন হাজারো প্রশ্ন রয়েছে যার উত্তরগুলি সি এবং সি ++ উভয়ের সাথেই প্রাসঙ্গিক। মনে রাখবেন যে এটি প্রশ্ন করার জন্য একটি সাইট। আপনি যেহেতু সাধারণ প্রশ্ন জিজ্ঞাসা করছেন তার অর্থ এই নয় যে আপনি কোন ভাষাটি ব্যবহার করছেন তা আপনি জানেন না। আপনি যদি সন্দেহ করেন যে এটিই কেস, তবে এই প্রশ্নের মতো, এটি সি বা সি ++ নির্দিষ্ট করতে কীভাবে সহায়তা করে? আপনি কি মনে করেন যে সি বা সি ++ এর ক্ষেত্রে প্রযোজ্য প্রতিটি প্রশ্ন দু'বার জিজ্ঞাসা করা হলে এটি সহায়ক হবে?
ক্রিস্টোফার বারবার

@ ক্রিস্টোফার: আপনি ঠিক বলেছেন, অনেকগুলি প্রশ্ন রয়েছে যেখানে উত্তরগুলি সি, সি ++ এবং উদ্দেশ্য-সি এর সাথে প্রাসঙ্গিক (এটি তাদের মধ্যে একটি)। কোন ভাষার অন্তর্ভুক্ত তা বোঝাতে স্ট্যাক ওভারফ্লোতে একটি হ্যান্ডি ট্যাগিং সিস্টেম রয়েছে। @ ডেনিস যেমন উল্লেখ করেছেন, এসও (এবং অন্যান্য প্রোগ্রামিং ফোরাম [ফোরা?]) এমন অনেক লোক আছেন যারা সি এবং সি-উত্পন্ন ভাষার মধ্যে বর্ণনাকে নিয়ে বিভ্রান্ত হয়ে পড়েছেন যারা এই ভাষাগুলিকে আন্তঃ পরিবর্তনীয়ভাবে সি / সি ++ তৈরি করে উল্লেখ করেছেন যথাযথ ভাষায় প্রশ্নের উত্তর দেওয়া আরও কঠিন।
জনসিওয়েব

2

বেশ না

int main(void)
{
   #if 0
     the apostrophe ' causes a warning
   #endif
   return 0;
}

এটি "tc: 4: 19: সতর্কতা: জিসিসি ৪.২.৪ সহ 'অক্ষর অনুপস্থিত' দেখায়


2
এই সতর্কতা সংকলক নয়, প্রিপ্রোসেসর দ্বারা উত্পাদিত। সংকলকটি কেবল দেখতে পাবে: # 1 "টিসি" # 1 "<বিল্ট-ইন>" # 1 "<কম্যান্ডলাইন>" # 1 "টিসি" ইন্ট মেইন (শূন্য) {রিটার্ন 0; }
জনসিওয়েব

0

এটি মন্তব্য করার একটি সস্তা উপায়, তবে আমি সন্দেহ করি যে এটির ডিবাগিং সম্ভাবনা থাকতে পারে। উদাহরণস্বরূপ, ধরুন আপনার কাছে কোনও বিল্ড রয়েছে যা কোনও ফাইলে আউটপুট মান দেয়। আপনি এটি চূড়ান্ত সংস্করণে নাও চান যাতে আপনি #if 0 ... #endif ব্যবহার করতে পারেন।

এছাড়াও, আমি সন্দেহ করি যে ডিবাগ উদ্দেশ্যে এটি করার আরও ভাল উপায় হ'ল:

#ifdef DEBUG
// output to file
#endif

আপনি এটির মতো কিছু করতে পারেন এবং এটি আরও বোধগম্য হতে পারে এবং ফলাফলগুলি দেখতে আপনাকে কেবল ডিবাগকে সংজ্ঞায়িত করতে হবে।

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