 اسلام علیکم today is lecture number 23 of CS201 introduction to programming I hope that everything went off alright and I am talking about your midterms things should not have been too difficult as I mentioned earlier ہم یہ چاہتے ہیں کہ دیکھا جا آپ نے ابھی تک کیا سیکھا ہے and as I keep repeating it only comes with a lot of practice you have to keep on writing code and making sure you understand what you are writing یہ بھی اہم چیز ہے کہ آپ کو سمجھ بھی آیا آپ کیا لکھ رہے ہیں اور پھر سپیسفے کوئی آپ نے لیے پروبلمز لیں بک کے اندر بھی بہت سارے پروبلمز دیے ہوئے ہیں اور ان کو بھی ایکسسائز کے طور پہ آپ ٹریٹ کریں and become proficient in the use of code ہم جو توپک ایہا ڈرس کرنے جا رہے ہیں وہ ہے پریپروسسر کا اور ہیڈر فائلز کا آج کا ہمارا اجندہ جو ہے وہ ہم پریپروسسر کے بارے میں بات کریں گے اس کے دیریکٹفز کی بات کریں گے دیکھیں گے یہ کرتا کیا ہے اور کیوں استعمال ہوتا ہے اور اسی کے ذریعے ہم آگے چلکے ہیڈر فائلز کی بات کریں گے جو آج تاکہ استعمال ضرور کرتے آئے ہیں لیکن ہم نے اس کو ایک اسم کام magic رکھا ہوا تھا کہ جی آپ یہ لکھنے آگے کام چل جائے گا آج ذرا اس کے اندر ہم کھول کے ہیڈر فائلز کو بھی دیکھیں گے کہ ان کے اندر کیا ہوتا ہے پھر ہم انی ہیڈر فائلز کے تھروو میکروز کی بھی بات کریں گے which is like code substitution جیسے ہماری زندگی کچھ حتک آسان ہو جاتی ہے اور ایک اتنے minor topic ہے related اسی طریقے سے ڈیفائن کرنے کا ان کی ہم بات کریں گے تو آئے پہلے ہم پریپروسسر کی بات کرتے ہیں سی جو ہے وہ ایک بڑی کنسائیسی لنگج ہے چھوٹی لنگج ہے اس کو انہانس کرنے کے لیے ہمارے پاس ایک پریپروسسر بھی ہے یہ ہر کی سی کمپائلر کے ساتھ آتا ہے پریپروسسر کرتا یہ ہے کہ کمپائل کرنے سے پہلے اگر آپ نے پروگرم کے ساتھ کچھ منیpulation کرنی ہو تو یہ پریپروسسر ایکشن میں آتا ہے یہ code کو کچھ تبدیلیاں کرتا ہے اس کے اندر کوئی چیز شامل کرتا ہے یا کوئی definition include کرتا ہے اور پھر جاکے کمپائلر کو وہ فائل ملتی ہے عام طور پہ ہمیں یہ نظر نہیں آتا کہ جنب کیا چیز include ہوئی ہے کیونکہ کوئی intermediate فائل ہمارے ہاتھ میں نہیں آتی but nonetheless there are lots of usages of this پریپروسسر ابھی تک ہم جو بات کرتی آئے ہیں آپ کو یاد ہوگا کہ شاپ include کا ایک directive تھا وہ ہم ہر پرگرم سے اوپر لکتے تھے something like sharp include iostream.h اور ہم نے کہا تھا کہ یہ جادو کی چیز ہے ابھی آپ لکھ لے ہم بعد میں بات کریں گے iostream کی ابھی باری نہیں آئی وہ ہم پھر اور اس کو دلے کرتے ہیں ابھی آگے چاکے اس کو دسکس کریں گے لیکن آج یہ sharp include والی جو بات ہے اس کے بارے میں we would like to discuss a little bit پریپروسسر کرتا کیا ہے دیکھیں جب ہم اس کیسم کا کوئی directive دے دیتے ہیں جہاں پر ہم لکتے ہیں کہ sharp include فلانی چیز تو وہ جو فلانی چیز ہے which usually is a text file it's an ordinary text file دیکھیں اس کے اندر لکھا ہوتا ہے کوئی ترتیب کی چیز لکھی ہوتی i.e. c کا code ہوگا یا کوئی definitions ہوگی وہ جہاں پہ یہ لائن program کے اندر ہم لکھتے ہیں sharp include والی اس جگے پہ وہ پوری کی پوری فائل وہ شامل ہو جاتی ہے as I said earlier یہ شامل ہوئی فائل وہ ہمیں نظر نہیں آتی لیکن compiler کو ضرور نظر آتی ہے لیکن when the compiler starts compiling it sees all of the things in that file almost all of the directives of the preprocessor they begin with the sharp sign تک ہے جو حش سیمبل ہے آپ کی کیبوٹ پے ملتا ہے تو ہر لائن جو ہے وہ شامل سے شروع ہوتی ہے دو مجر چیزیں ہیں جو کہ ہم preprocessor directives کے ساتھ کرتے ہیں پہلا وہ ہے جس کے ساتھ میں ابھی بات کر رہا ہوں وہ ہے include include کے ساتھ جو نمالی جو لکھتے آئے ہیں وہ فائل جو ہے وہ angle brackets میں greater than or less than sign کے اندر فائل کا نام دیتے آئے ہیں یہ جو اس طرح سے ہم لکھتے ہیں that tells the c compiler کہ یہ فائل ایک خاص location میں ایک خاص folder میں پڑی ہوئی ہے وہاں سے اس کو include کر لیا جائے so iostream.h ہم نے include کی ہے standardlib.h include کی ہے fstream.h include کی ہے string.h include کی ہے بہت ساری فائلیں جو ہے وہاں exercise میں استعمال کرتے رہے ہیں اور سب کے نام جو ہے وہ ہم نے angle brackets کے اندر include کیا تھے these names are located in a specific directory اگر آپ اپنا ہمارا والا compiler استعمال کر رہے ہیں which is dev c++ تو اس کا ذرا directory structure ضرور دیکھئے گا windows explorer میں اس کو کھولیں اور left side پہگر dev c++ کو کلک کریں گے تو right والے پین کے اندر آپ کو کئی سب فولڈرز نظر آئیں گے ان میں سے ایک سب فولڈر جو ہے وہ include کا سب فولڈر ہے اس کو اگر double click کرنے یا اس کو left side پہ کلک کر لیں تو right side پہ آپ کو بہت ساری فائلیں نظر آئیں گے اور usually ان کا نام something.h ہے h stands for header files why do we call them header files because normally یہ چیزیں ہم یہ فائلیں جو ہے یہ اپنے program کے اوپر دالتے ہیں سب سے اوپر include کرتے ہیں کیوں کہ یہ اوپر آتی ہیں اس پاستے ہم ان کو header کہتے ہیں کوئی limitation نہیں ہے آپ include کے ساتھ file اپنی source file کے اندر کہیں بھی کوئی text یا کوئی اور file include کر سکتے ہیں of course it has to make logical sense کہ ایک program چل رہا ہے اس کا ایک حصہ کہیں اور آپ نے لکھا ہے وہ include کر کے یہاں پر لیا ہے it has to be in the proper position but nonetheless normally these .h files and the h again stands for header are included at the top of the program why do we need these header files جب ہم نے functions کی بات کی تھی بہت عرصہ پہلے تو ہم نے بات کی تھی کہ جی اگر program کے اندر let's say آپ کے main کے اندر کوئی بھی function آپ نے refer کرنا ہو یا function call کرنی ہو تو function کا prototype وہ پہلے define کرنا لازمی ہے یعنی compiler کو یہ پتا ہونا چاہئے کہ function کا نام کیا ہے اس کے argument کیا ہے اور یہ return کیا کرتا ہے یہ چیزیں پتا ہوں گی تو پھر وہ پہلہ pass کیا ہے compilation کا وہ اس سے گزر سکتا ہے جہاں تک رہی بات کہ وہ function کا ہمارے program کے اندر شامل ہوگا normally functions یا laboratory functions وہ علیہ دا سے compiled libraries میں پڑے ہوتے ہیں وہ linker کا کام ہے کہ جی اس وقت جب آپ کا object code بن گیا یعنی source code سے compiler نے پہلہ pass کر لیا اور source code کو convert کر دیا into object code object code is machine code لیکن یہ بھی چل نہیں سکتا ہے it is not executable code جس کو ہم کہتے ہیں relocatable executable وہ نہیں ابھی بنا object code جب بن جاتا ہے اس کے ساتھ باکی libraries میں سے وہ functions کا object code شامل کیا جاتا ہے جو کہ ہمارا program استمال کرتا ہے وہ جب program شامل ہو جاتا ہے پھر اس کے ساتھ کچھ memory locations وغیرہ کی information ساتھ include کر کے پھر ہماری executable file بنتی ہے یہ تو linker کا کام ہے compiler نے ہم نے جو بھی function استمال کرنا تھا اس کو compile کر کے machine code میں اس کا نام اور arguments include کر لیے لیکن compiler یہ بھی چیک کرنا چاہتا ہے کہ یہ function call جو ہم نے لکھی ہے یہ valid ہے کہ نہیں ہے اس کی validity چیک کرنے کے لیے compiler یہ چاہتا ہے کہ یا تو function کی definition پہلے آ چکی ہو یعنی پورا function کرتا کیا ہے اور اگر definition نہیں آئی جو تاکہ function کی شکل نظر آ جائے جب تو ہم اپنے function لکھ رہے ہیں تو ہمارے پاس یہ دونوں options ہیں کہ ہم function اوپر define کر دیں پھر ہم main کے اندر آیں جہاں پہ ہم نے یہ function استمال کرنا ہے and we go on like that in which case the definition of the function جو اوپر ہم نے لکھی ہے وہ prototype کا بھی کام کر دیتی ہے اور definition کا بھی کام کر دیتی ہے دونوں کام ہو جاتے ہیں main کے اندر ہم وہ line لکھ سکتے اور compile کرتے وقت وہ function بھی compile ہو جاتے ہیں اور main بھی compile ہو جاتا ہے link کریں اور چلا لیں in case and as the programs become big یہ مشکل ہو جاتا ہے کہ جیسارے functions پہلے اوپر define کیا جائیں کئی دفعہ ہم کرتے ہیں کہ functions ایک علیادہ فائل میں define کر دیتے ہیں اور اس کو علیادہ سے compile کر کے object file بنا لیتے ہیں اور main کے اندر صرف وہ functions استمال کرنا چاہتے ہیں اس case کے اندر ہم function کی کیونکہ definition اب کسی اور file میں یا کہیں اور پڑی ہوئی ہے ہم چاہتے ہیں کہ functions کی declarations اوپر آجائیں وہی بات کہ اگر یہ program ہمارا یہ complex ہو گیا اور اس کے اندر bco functions ہیں تو یا تو آپ main کے اوپر وہ bco definitions یا prototypes لکھیں اور پھر جاکے main کی body وہ لکھنی شروع کریں دوسرا طریقہ یہ ہے کہ آپ اپنی خود header file بنا لیں so you can call it something like my header.h یہ جو file اس کے اندر کچھ بھی نہیں ہوگا صرف function prototypes listed ہوں گے یہ function prototype لکھ کے اس file کے اندر آپ اس کو سیب کر دیں ordinary text file کے طور پہ اب جب آپ main لکھنے آتے ہیں تو اس میں جو system requirements یا شاپ include iostream.h اگر آپ نے input output کرنی ہے وہ تو آپ لکھ لیں گے اس کے بعد آپ شاپ include کے ساتh my header.h بھی بیچ میں لکھتیں گے normally کیونکہ یہ file جو ہے یہ ہمارے کسی foldر میں پڑی ہوتی ہے اور normally اس foldر میں جہاں پہ ہمارے main program اس کا source code پڑا ہوا ہے اس واصل اس کو angle brackets میں include نہیں کیا جاتا اس کو double quotation marks کے اندر include کیا جاتا ہے double quotation marks میں جب ہم file کا نام دیتے ہیں تو include وہ current working directory کے اندر اس file کو دھونتا ہے so keep that difference in mind then the c compiler looks in a specific location وہ location جو کہ compiler کو پتا ہے include files کہاں پڑی ہوں اگر آپ dev c++ میں ہی دیکھیں تو آپ کو tools کے نیچے options کا ایک ملتا ہے جہاں پہ پورا دیلوگ باکس کھلتا ہے جہاں پہ آپ اس کو بتا سکتے ہیں کہ include files کہاں ہیں اور باکی چیزیں کہاں ہیں اور library's کہاں ہیں وہ ہے the one that relates to the angle brackets جب ہم اپنی header file لکھتے ہیں تو normally جو ہمارا source code ہے وہ شہد my documents میں سیب ہو رہا ہو اگر وہ وہاں پے ہو رہا ہے تو ہماری header file بھی ہم اسی foldر کے اندر رکھیں گے اور اس کا نام جو ہے program کے اندر وہ ہمارا program کمپائل کرو تو وہ پہلے sharp include directives کو دیکھتا ہے یہ جو directives ہیں ایک ایک کر کے process ہوتے ہیں سب سے پہلہ directives اگر کہتا ہے sharp include angle brackets میں iostream.h تو وہ del c++ یا جو بھی آپ c-compiler استعمال کر رہے ہیں اس کے include directives میں جائے گا اور دیکھے گا کہ the iostream.h کہاں پہ اور پھر اس کو آپ کے program کے اوپر وہ شامل کر دے گا so in a way your source code is expanding next line کوئی اور شاید آپ نے sharp include لکھا ہو اس میں جو فائل لکھی ہوئی ہے وہ ساری include ہوگی in the same order یعنی iostream اگر اوپر لکھی تھی تو پہلے iostream.h آئے گی اس کے بعد شاید آپ نے fstream.h لکھا ہو اس کے بعد fstream.h کا code آئے گا اس کے بعد اگر آپ نے لکھتی ہے my header.h تو جو my header.h اس کے اندر آجائے گا پھر آپ کا اپنا program آئے گا اور یہ ساری جو بڑی expanded فائل ہے پھر یہ compiler کو دی جائے گی کہ جی اب اس کو compile کرو so you have to be careful and you have to understand کہ یہ in order of definition جو ہے inclusion ہوتی ہے code کی in a way آپ کا program اس وقتا بہت پھیل چکا ہے بڑا ہو چکا ہے luckily we never get to see it ہمیں تو end پے جاکے executable ملے گی اب ان کے اندر یہ بھی دیکھنے والی بات ہے کہ جی یہ include فائل صرف اوپر آسکتی ہیں یا program کے درمیان میں بھی دالی جا سکتی ہیں as I mentioned earlier there is no requirement کہ جی include فائل جو ہے وہ صرف program کے اوپر ہوں کوئی limitation نہیں ہے ہاں normally ہم اوپر ہی include کرتے ہیں because they are headers ہم یہ نہیں کرتے کہ code کا segment اس کو کہیں اور define کر کے اس کو include سے بیچ میں لیائیں کیا جا سکتا ہے but that is not the practice اس کے علاوہ اور ہمارے پاس کنسے directives ہیں ہم نے ایک sharp include کر بھی discuss کیا one of the other major directives is the sharp define directives sharp define کے ساتھ آپ macros define کر سکتے ہیں macro ہم کہتے ہیں کہ جی ایک خاص نام جس سے substitute کر کے ہم کوئی چیز expand کر کے وہاں پے include کی جا سکتی ہے macro کا کام جو ہے ایک دو شاید ہم نے استعمال بھی کیے ہیں otherwise let's talk about them now for example ہم کوئی program لکھ رہے ہیں جس کے اندر ہمیں pie کی value کی ضرورت ہے pie is like as you know a universal constant 3.1415926 اور وہ چلتا جا رہا ہے and computers لگے میں اس کی values calculate کرنے کے اندر لیکن ایک constant ہے بجائے اس کے کہ ہمارے code میں جہاں پے بھی pie کی value کی ہمی ضرورت ہو وہاں پے ہم یہ value لکھ رہا ہوں 3.1519 whatever اس سے بہتر یہ ہے کہ شاید ہم ایک جگہ پے کہیں پے pie define کر دی now آپ کہیں گے کی جی یہ تو ہم ایک variable سے بھی کام کر سکتے ہیں بالکل صحیح ہے کہ آپ variable کے ساتھ بھی آپ کیا سکتے ہیں double pie اور پھر یا وہیں پے اس کو assign بھی کر دیں value یا آگے جاکہ آپ لکھیں pie equal to something اور پھر pie کو استعمال کرتے رہیں no problem but actual situation اس کی اس طرح اگر آپ pie define کریں گے تو it's just an ordinary variable if it is a variable تو اس کی value reassign بھی ہو سکتی ہے ہم چاہ رہے ہیں کہ جہاں پے بھی ہم pie لکھیں وہاں پے pie کی natural constant اس کی value آئے اور کوئی value نہ آئے تو ہم کیا کرتے ہیں ہم program کے اوپر یہ ایک line لکھ دیتے ہیں sharp define or define poor English کا word ہے which means define whatever اور اس کے بعد جو بھی ہم symbolic name استعمال کرنا چاہتے ہیں وہ نام لکھ دیتے ہیں in this case pie PI اور پھر یہ بھی convention ہے کہ جب ہم اس طرح کی نام لکھ رہے ہیں تو ان کو full capitals میں لکھیں اس کا فائدہ یہ ہوتا ہے کہ code میں جہاں پے ہم یہ variable یا رڈ سے symbolic constant not a variable symbolic constant یہاں پے بھی ہم استعمال کر رہے ہیں وہ ہمیں نظر آ جائے گا اسانی سے تو ہم نے لکھا sharp define اور پھر اس پیس دیکھے ہم نے لکھا 3.1415926 یا whatever value we want to assign to this constant اب یہ جو ہے pre-processor اس کے ساتھ کیا کرتا ہے pre-processor یہ کرتا ہے جب آپ کہتے ہیں code کو کہ اس کو compile کرو تو پہلے دیکھتا ہے کہ یہ sharp defines کون سے ہیں ایک تو sharp includes کیا ہم نے بات کی وہ فائلیں کی فائلیں جو ہے پورا text میں include ہو گیا اب وہ یہ کرتا ہے کہ define کے ساتھ جو بھی آپ نے نام لکھا بے وہ جہاں جہاں code میں آتا ہے وہاں پہ نام replace ہو جاتا ہے it is replaced with the value of the name assigned with the sharp define statement so in a way compiler کو pie نظر نہیں آتا compiler کو جہاں جہاں ہم نے source code کے اندر pie لکھا تھا وہاں پہ 3.14159 ہی نظر آئے گا اب اس کا فائدہ کیا ہے نقسان کیا ہے سب سے بڑا فائدہ تو یہ ہے کہ suppose ہم دیکھنا شروع کیا تو اس وقت pie کو define کیا ہے is 3.14 بچوں والی definition 2 decimal places تک اس کے بعد جب ہم نے کوئی computation کیا اور ہم اپنے results کو دیکھنے لگے تو لگا کہ یہ تو کافی accurate نہیں ہے بہتر یہ تھا کہ ہم pie کی value کو 4 decimal places تک لے جاتے اب دیکھیں اگر ہم نے pie کی value code کے اندر ہر جگے پہ لکھی ہوتی ہے as 3.14 تو آپ اور اس کو replace کر کے ہر جگے پر اس کو 3.14 15926 لکھ رہا ہوتے problem کہیں نہ کہیں کوئی value miss بھی ہو سکتی ہے ایک دوسرا کہ شہد 3.14 کہیں اور لکھا ہو کسی اور وجہ سے اور وہ pie نہ ہو کوئی اور constant ہو میں tax rate ہو اگر کسی نے funny tax rate رکھا ہوا اور اس کو بھی ہم pie کی value کے ساتھ ہی بدل دیں so you can't do a blind search and replace it to work it's much nicer کہ pie اوپر ہم نے define کیا ہے اور نیچے pi جو symbol ہے وہ استعمال کر رہے ہیں code کی اندر جب ہم نے value کو update کرنا ہے بدلنا ہے یا اس کو زیادہ decimal places تاک استعمال کرنا ہے تو program میں ایک جگے پہ جاکے ہم نے pie کی value بدلی اور پھر جب کمپائل کریں گے تو ہر جگے پہ وہ value substitute ہو جائے گی اس چیز کا خیال رکھی ہے کہ جب ہم شاپ define کے ساتھ تو وہ actual code میں substitution ہوتی ہے before it goes to the compiler this gives us very nice control کہ جی ایک جگے پہ value بدلی پورا program وہ update ہو گیا اس کو combine کریں شاپ include کے ساتھ کہ جی ہم نے ایک my header dot h بھی لکھی تھی اپنی header file تو کیوں نا pie کی definition header file میں ہی دال دیں اس کا فائدہ کیا ہوگا جہاں جہاں وہ automatically pie کی نئی value وہ وہاں پے updated ملتی رہے گی آپ کے program کو for example اگر آپ کے پاس 5 functions ہیں اور 5 functions کے اندر pie استمال ہونا ہے اور آپ نے ان کی علیدہ علیدہ source code files بنائیں rather than ایک لمبی file کے تو آپ کو 5 جگے پہ شاپ define pie 3.14 etc. کرنا پڑے گا وہ بھی آپ اپڑیٹ کریں جب بھی آپ program کو recompile کریں گے everything will be updated so it's a nice way of doing things ایک چیز کلیر کرتا چلو یہ جو ہمارے pre-processor directives ہیں sharp include sharp define یہ c کی statement نہیں ہیں since they are not c statement ان کے end پے ہم semicolon نہیں لگاتے اس کیز کا خیال رکھیے گا otherwise that becomes like a syntax error صرف یہی دو pre-processor directives نہیں کافی سارے اور ہیں یہ list بھی آپ دیکھلی جب آپ کے hand out میں بھی دی ہوئی ہے شاہر رہے کہ pre-processor directives سب جو ہیں وہ شاپ سائن کے ساتھ شروع ہوتے ہیں اس کے ساتھ ہم conditional compilation بھی کر سکتے ہیں if بھی ہے ہمار پاس sharp if sharp else sharp end if اس کے لیے sharp el if یہ بھی چلتا ہے اس کے بعد ہم یہ بھی چیک کر سکتے ہیں کہ جی کوئی سیمبل جو ہم نے define کیا ہوا ہے کہ نہیں so we can say if def اور اگر define کیا ہوا ہے جیسے ہم نے pie استعمال کیا تو we can always سے کہ جی if sharp if def pie which means اگر pie define ہوا ہے تو پھر یہ کرو اور نیچے کچھ ہمار پاس تیٹمنٹس آ جائیں گی یہ conditional compilation دوسی چیز جو important ہے کہ for example اگر pie already defined ہوا چینی sharp define pie کہیں پے کیا ہوا ہے تو it is an error to try and define it again اس باستے اس کو پہلے undefined کرنا لازمی ہے اور undefined کے لیے sharp undef آ جاتا ہے so کافی سارے ہیں جو pre-processor directives اور conditional compilation کے اندر ہمیں جو فائدہ ملتا ہے وہ یہ ہے آپ چاہتے ہیں کہ اس کو debug کرنا چاہیں اور debugging کے اندر ایک common technique یہ ہے کہ جی آپ کوئی output statements پے لکھنا شروع کر دیں at various points in the program to see کہ یہاں تک ٹھیک کام کیا ہے یہاں پہ یہ value آ رہی تھی آگے چلیں یہاں پہ یہ value آ رہی تھی and so on so you sprinkle your source code with lots of output statements which normally start giving you a picture کہ جی program کیا process کر رہا ہے اب جب سب کچھ ٹھیک ہو جاتا ہے and you know that your program works fine it is extremely tedious to go and start removing all these output statements which weren't part of the problem definition اس میں ہمیں نہیں چاہئے تھی یہاں ہم نے debugging کے لیے استمال کی وہاں پہ ہم پھر conditional compilation کر سکتے ہیں کہ جی اوپر ایک کوئی symbolic name define کر دیں let's say debug اور نیچے جاکے define ہے if deaf debug تو پھر یہ output سٹیٹ میں چلا دو sharp and if اب فائدہ یہ ہوگا by the way اب دیکھیں میں نے کیا کیا ہے کہ جی sharp define debug پہلے جو ہم نے sharp define کا اگزامپل کیا تھا اس کے اندر پای کو ایک value دی تھی ضروری نہیں ہے کہ sharp define کے ساتھ value دی جائے صرف یہ کہدنا sharp define pie مینس کے ایک symbol pie جو ہے وہ define ہو گیا ہے اس کی value کوئی نہیں ہے یہ جانتا ہے کہ as far as the compiler is concerned اسی طریقے سے جب ہم ٹیست کرنے جاتے ہیں کہ if deaf if defined ہم لکھ سکتے ہیں آگی pie obviously that is too contrived لیکن دیبگیں کے حوالے سے دیکھیں ہم کہتے ہیں sharp define debug اب debug ہم نے پورا capitals میں لکھ دیا کوئی value نہیں دی لیکن نیچے جاکے اگر ہم یہ لکھیں گے sharp if deaf debug تو that will return true that is how we use simply defining a name makes it exist as far as the compiler is concerned so we can do conditional compilation we can do actual macro translation which means replacement of a symbol by the value in front of it and remember you cannot redefine a symbol without undefining it first undefine کرنے کے لیے جو بھی symbolic name آپ نے استعمال کیا تھا for example debug یا pie یا کوئی اور چیز وہ لکھ دیں گے تو اس point onwards اس point سے آگے کو وہ symbol available نہیں ہوگا so that means that the compiler will now no longer see that symbol and you can redefine it this is I will repeat it's important you cannot define a symbolic name if it already exists in the definition so if you want it to be undefined it's important for practice what I would strongly recommend is you should open some header files and see for example you made an assignment in it we have console input output this is the legacy of the old language and our keyboard systems and the ones which are not using graphical user interfaces we use so you had two varieties you had dev c++ at least there was conio.h as a header file and one was its variant conio.c you should open don't edit don't change maybe stop working or some kind of effects but try to read initial impact would be oh open don't worry actually you now have enough knowledge to actually read it line by line if you look at it you will find strange symbols کوئی name ہے کسی variable کا or constant کا ونہوں استعمال کیا ہوا تو you might find کہ اس سے پہلے underscore characters لگے میں underline والا میں ایک لیکچر میں پہلے بھی ذکر کیا تھا کہ بہت سارے internal constants or internal symbolic names جو کمپائلر ہمارے استعمال کرتے ہیں ان کا name normally double underscore کے ساتھ کہ ہم اپنے لیے کوئی اسی variables استعمال نہ کریں جن کا name جو ہے وہ double underscore سے شروع ہو رہا ہو that was just an aside but if you look at some of these files which we have been using in our programs you will find for example یہ کون i o کے اندر آپ کو get che کی definition بھی ملے گی ایک فائل میں صرف لکھا ہوگا int get che parentheses which means it's a declaration دوسی والی فائل کے اندر جو ایک فائل ہی دیا ہوا ہے so in a way the function is defined over there so you might want to compare and read through these files and it's interesting to understand جی چیزن جو define کی گئی ہے جب آپ include کرتے ہیں پوری فائل آپ کے پرگیم کے اندر چلیگی اور وہ define چیزیں آپ کے پرگرم کو available ہو جاتی ہیں For example اسی کو ایک عامل کو لے لیں اگر کہ کون i o وتی یک کون i o اپنے صورت میں کلوڈ نہیں کرتے اور آپ وہاں پہ کہیں پہ جاکھی کہ دیتے ہیں getCHE which is get character with echo for those of you are interested کہ جب ہم کی دبائیں تو وہ echo بھی کرے screen پہ بھی نظر آئے کہ ہم نے کونسا بٹن دبایا ہے so getCHE اگر ہم نے پرگرم میں لکھا اور اوپر include نہیں کی فائل تو you will get a compiler error وہ جو نیچے والا آپ کی error statement آری ہوتی ہیں چھوٹی window کے اندر وہاں پہ آگیا آجائے گا something like getCHE not defined اس وجہ سے کہ ہم نے وہ ہیڈر فائل include نہیں کی جس کے اندر اس فنچن کی definition ہے again one of these two there is a very interesting construct right at the top which says something like if def c++ تو پھر extern c کر کے لکھا ہوئے کچھ اور پھر ڈیف ہے which means اگر آپ اس کو c code کے حوالے سے اگر دیکھیں تو لگتا یہ ہے کہ یہ اگر کوئی چیز defined ہے تو پھر اس نے ایک line لکھی ہے جوکہ اس فائل کے اندر include کی جانی چاہی ہے وہ line اگر دیکھیں دے اس کے اندر brace بھی دلہ ہوئے ایک opening curly bracket دلہ ہوئے تو اگر opening curly bracket ہے تو وہ ختم کہاں ہوتا ہے go to the bottom of the same file I don't remember which one it is but go to the bottom of that file conio.c probably یہاں پہاں آپ کو پھر وہی if def نظر آئے گا اور اس if def کے ساتھ closing curly bracket دلہ ہوگا تو یہ ایک سامپل ہے conditional compilation کی کہ یہ اگر یہ symbol defined ہے تو یہ line بھی include کرو اور یہ والی line بھی include کرو and then you've got a code block جہاں پہ اوپر بھی ایک brace ہے اور نیچے بھی ایک brace ہے so lots of things that you see in these files I would strongly urge you جتینی آجتاک ہم استعمال کرتے ہے ان کو کمست کم کھول کہ ایک sir-sri نظر رجور گزارے so that you can see کہ جی how professional programmers یا programmers جوکے complainers لکھ رہے ہیں وہ کس طرح سے code لکھتے ہیں اگر آپ کے پاس line x operating system ہو it is free اور اس کا source code بھی free ہے سارہ c میں لکھا ہوئی ہے you can take a look at the functions written by the gurus or the c gurus کہ actually لکھ رہے ہیں آپ کے string manipulation function, string copy کا source code آپ کو مل جائے گا string compare کا مل جائے گا and it is a good idea to read how the master's right code شہد آپ کا style بھی جو ہے وہ اس کے ساتھ affect ہو let's go on and look at a real macro macro's جو ہیں وہ دو مختلف varieties میں آتے ہیں ایک macro ہم استعمال کر چکے ہیں وہ تھا شارپ define pie اور آگی اس کی value دی اور یہ actually macro کا مطلب ہے کہ جہاں پہ پائے آئے گا وہاں پہ اس کی value سبسٹیٹ ہو جائے گی اس طرح کے جو a simple macro's ہیں which are more like symbolic names being mapped on to constants وہ دو ہم عام طور پہ استعمال کرتے ہیں لیکن ایک اور کسم کا macro ہے جو کہ argument بھی لیتا ہے یہ نہیں it's a parameterized macro for example اگر میں یہ ایک macro لکھوں شارپ define square اور parenthesis کے اندر x اب میں چاہی رہوں کہ اس کے بعد اس کی definition لکھوں تو definition space چھوڑ کیا ہم لکھتے ہیں x star x remember یہ pre-processor میں لکھ رہے ہیں یہ c کا source code نہیں ہے لہذا یہاں پہ سمیکولن نہیں دا لیں گے ہوگا یہ کہ جہاں پہ بھی آپ کے program میں آپ نے لکھا square something تو compilation سے پہلے ہی آپ نے لکھا وہاں پہ جاکے let's say square i تو یہ macro جو ہے وہاں پہ رپلیس کر دے گا i star i وہاں پہ لکھا جائے گا square غیب ہو جائے گا parenthesis غیب ہو جائیں گے full substitution ہو جائے گی جب i star i لکھا گیا پھر آپ نے program جو ہے وہa compiler کو دیا اور اس نے compile کر کے executable code بنا دیا اب اس کے اندر تھوڑی سی problems آ جاتے ہیں problems کی آتے ہیں suppose میں نے یہی definition اوپر لی because square x اور اس کی define کر دیا x star x نیچے جاکے میں نے کہا square اور parenthesis کے اندر لکھتی ہے i plus j آپ ذرا substitution کریں دیکھیں کیا ہوتا ہے x کی جگے پہ ہم نے لکھا ہے i plus j جب سبسیٹوٹ کریں گے لکھا جائے گا without any parenthesis it will write i plus j star i plus j now that certainly is not the square of i plus j what it will be is i plus j times i plus j which is quite different اس کو کیسے over come کیا جائے اس کو over come کرنے کا طریقہ یہ ہے جب بھی آپ کوئی parameterized macro لکھیں تو جہاں پہ آپ نے لکھا square x اور parenthesis کے اندر x ہے آگے جب definition کی باری آتی ہے پہلے تو آپ پوری definition کو parenthesis میں دال دیں so x star x نہ لکھیں آپ parenthesis کے اندر لکھیں x star x ابھی بھی کافی نہیں ہے کیونکہ x کا وہی حال ہوگا اگر نیچے i plus j آگیا اب کیا کریں کہ جی x کو بھی parenthesis میں دالے so it starts reading like sharp define square parenthesis x parenthesis closed پھر space دیکھے open parenthesis اور پھر x جو ہے وہ parenthesis کے اندر آئے گا پھر star آئے گا یعنی multiplied by اور پھر parenthesis کے اندر x آئے گا end parenthesis closed اب اس کو ذرا وہاں سے دیکھیں کہ جب نیچے میں نے جاکے کوڑ میں لکھ دیا square اور parenthesis کے اندر i plus j وہاں پہ کیا ہوگا کہ وہ parenthesis بھی یہاں پہ کافی ہو جائیں گے now i will get i plus j within parenthesis star i plus j within parenthesis and then the whole thing enclosed within brackets this is the correct statement because it will say i plus j multiplied with i plus j so we can use this macro substitution now what is the difference between using this square x with a function called square x کوئی فائدہ نقصان آپ کو نظر آتا ہے you see whenever we call a function تو compiler نے بھی کچھ کام کرنا ہے لیکن program جب چل رہا ہوتا ہے اس وقت کافی سارا کام کرنا پڑتا ہے آپ کو تھوڑا سا ابھی تک خیلہ انٹردیکٹنٹو کمپوٹنگ میں بھی اس کے بات ہوئی تھی کجی ہماری جو مشینے ہیں this theory of computation this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is this is وہainssuspends there, control to the main program،5080 what jles meaning is that there is sustainable overhead اس کام overhead کہتے ہیں یہونی جب بھی ہم function کو call کرتے ہیںthere is some extra work that needs to be donewhenever we do a lot of function calla loop核 Wisconsin dirtyfunction call HOL her fluavar تو یہ overhead Hye cada lafa hoga یہی جیزی refer loop chalain Lie itни dafa macaron combos으 تمہیں دفا việcInker reflections انہوں کو آپ سمجھیں کہ یہ کمپوٹر ٹائم ہے سو ٹائم ویسٹ ہوتا ہے کمپوٹنگ ریسورسیز ویسٹ ہوتے ہیں اب بیسٹلی دیرہ مینی سیچویشنس where we can't do without a function call we have to call those functions that is all right بہت in this simple example جس کی میں ابھی بات کر رہا تھا سکویر کرنے کی اگر سکویر کو میں as a function call ٹریٹ کروں اور پروگرم وہ دس عزار دفعہ سکویر کا function call کرے تو a considerable time is wasted ہمارے ح聽 شiada سکومسکویر کرسکتے kilometer میکروو implementation کیا ہما کار میں لنی마� iconicWhoa recoveryiformإوجہبہ focuses شريحکوڈا its by expanding it it an example جو ہم لے کے چلے لے القیشی갔ی بெرن تیش کرن�� ویسٹ آکت میرے آکت میرے اپران rode altriہ하�ا prendre ڈ بеди liquidity م ا کے لی کامپا partie اپنے ملٹپلیکیشن اور اڈیشن لائنک، یہ سب کال نہیں ہے۔ اگر یہ کال نہیں ہے، توسی برہاں نہیں ہے۔ یہ چیزیہ وقت بھی بہت جائے۔ اسی طریقے سے آپ پرامیٹریز میکراوس ہیں، وہ کافی سارے کمپلیکٹس آپ لکھتے ہیں۔ اور فائدہ یہی ہے کہ جبھی آپ ان کو استمال کریں گے، کال سے بچا ہوں گے، کام آپ ہے زیادہ تیزی سے ہو جائے گا۔ یعنی اگر اتنا ہی فائدہ ہے ان کا ماکروز کا تو ہم فنکشنز کیوں لکھتے ہیں well the answer is simple first one is code bloat یعنی جہاں پہ بھی آپ نے ایک macro define کر کے اس کو parametrized macro کی definition دی وہ definition لکھے نیچے لکھی جائے گی which means اگر وہ بار بار code کے اندر آپ شامل کر رہے ہیں تو آپ کا code موٹا ہوتا جائے گا bloat کر جائے گا so that is called code bloat the plus side is you're getting faster execution the downside is آپ نے ایک بڑی بڑی بڑی بنیگی you've got a bigger program جی نیوز کی ایکسیکیوٹی بل فائل بھی بڑی بنیگی sometimes function calls are نیسسری you've got to do some complex work so it is better to define things in functions and take the overhead of a function call but for simple things like this square or some other definition or substitution it is nice to be able to write it in line and let it be expanded as part of the pre-processor جو چھوٹے چھوٹے پوئنٹس ہوتے ہیں چیزوں کے وہ میں منشن کرتا چلتا ہوں but you would also discover them by hit or trial but nice to know جب بھی ہم کوئی macro define کرتے ہیں جس نے arguments لینے ہیں تو macro کے نام کے فورن بعد open parenthesis آجا نا چاہیے یعنی وہاں space نہیں دینی جیسے ہی space دی تو وہ شارپ define والا پائی والی situation میں آپ چلے گئے کہ یہ نام ہے اس کی جگہ پہ یہ سبسیٹوٹ کر دو ہم چاہ رہے ہیں کہ ایک argument والا macro define ہو تو اس کے ساتھ macro کے نام کے ساتھ ہی آپ parenthesis open کر دیں گے پھر اندر ایک یا اس سے زیادہ آپ arguments دے دیتے ہیں یہ نام وہی ہوئیں جو see variables کے نام ہیں بالکل وہی rules اس کو follow کرتے ہیں اور اگر ایک سے زیادہ ہو تو comma separated list ہوگی پھر آپ parenthesis بن کرتے ہیں پھر space آتی ہے اور space کے بعد جو ہے وہ macro کی definition آئی گی آئی یہ ایک example دیکھ لیتے ہیں جو زیادہ زیادہ useful ہے یہاں پہ ہم area of a circle کا ایک macro بناتے ہیں اب area of a circle آپ کو پتا ہے وہ py r squared ہے where r is the radius of a circle so suppose we have a program جہاں پہ ہم نے circle کا area جو ہے وہ بار بار compute کرنا ہے so what we do is we try to write a macro so that the area of the circle is substituted with the actual algebraic expression جب ہم compute کرنا چاہیں so اوپر اب دیکھیں اس کو logically ہم دو steps میں کرتے ہیں پہلے ہمیں py' کی ضرورت ہے py bazaar خود ایک natural constant ہے تو کیوں اس کو بھی define کر لیا جائے تو کیوں کہ ہم py' کو استعمال کرنا چاہتے ہیں تو سب سے پہلے py' کو define کریں تو ہم کہتے ہیں شاپ دیفائن space py in capitals pi his space دیکھیں py کی value لکھتے ہیں the number which we want to use for py اور وہ اتنی decimal places کا number ہوگا جتی ہم استعمال کرنا چاہتے ہیں یہاں بھی دیکھیں in float ڈبل نہیں چال رہے this is a constant so you can use 6 decimal places or 8 decimal places وہ computation کے اندر استعمال ہوگی جب py define ہوگیا next line کہتی ہے شاپ دیفائن circle area again from a perspective of visibility it would be nice اگر آپ circle area پورا کا پورا capitals میں لکھیں اب circle area جو ہے اس کو ایک تو py کی ضرورت ہے already defined ہے وہ natural constant ہے so it's no need to pass it to this function لیکن ایک چیز پاس کرنے کی ضرورت ہے وہ ہے radius تو radius کی جگہ پہ ہم parentheses کے اندر x لکھتے تھے x بھی ہم capital لکھیں گے تاکہ وہ کلیر رہے کہ یہ آگے جا کے سبسی چوٹ ہو جائے گا so ہم نے لکھا شاپ دیفائن circle area parentheses کے اندر capital x اور پھر space دیکھے circle area کی definition آ جائے گی اگر تو ہم definition سیمپل لکھتے ہیں which is pie in capitals star x star x no semicolon تو یہ سیمپل کام جو ہے وہ کر دے گا جہاں پہ بھی آپ circle area کو ایک کوئی value دے رہے ہیں وہاں پہ یہ computation تیک ہو جائے گی لیکن جیسے میں نے پہلے ارس کیا اگر وہاں پہ آپ radius جو ہے as an algebraic یا arithmetic expression دے رہے ہیں تو یہ definition fail ہو جائے گی اس کے لیے it is better to enclose all the x's in their own parentheses so we write pie star within parentheses capital x star within parentheses capital x اور پھر چاہیں تو سارے کو parentheses کے اندر enclose کر لیں اس کا فیضہ یہ ہوگا کہ اب یہ چھوٹا سا program آپ کو دکھایا ہوا ہے اس میں اگر دیکھیں تو جہاں پہ جاکے ہم کہتے ہیں circle area radius اور radius کوئی variable ہے جس کی کوئی value ہے تو radius جو ہے وہ automatically circle area جو ہے وہ پورا کا پورا replace ہو جائے گا with pie star radius star radius with all the parentheses is included and the answer of of course is the correct computation of the area of a circle on the other hand if we were to do something like کے جی اس سے اگر دگنہ بڑا ہو سا کل جنو اس کا radius اس سے دبل ہو تو اس کا area کیا ہوگا now because we have used parentheses in the definition of the macro we can easily write circle area to star radius and it will work کیونکہ یہ ملتیپلیکیشن ہے وہ ordinary x without parentheses والی definition بھی چل جانی تھی because we are saying pie star r star r تھی کے لئے ملتیپلیکیشن جو ہے وہ تو expand ہو جاتی ہے لیکن اگر کہی پہ کوئی addition یا subtraction آ جاتی تو parentheses کے بغیر یہ definition فیل کر جاتی so what we want to do is always be religious about the use of parentheses whenever we have macros that take arguments what else about these header files تھوڑی سی چیزیں ہیں وہ طرح سی complex ہیں لیکن آگے چل کے hopefully when you become professional programmers and you writing your own operating system you will learn more about them or use them properly for the moment یہ میں کہتا چلوں کے آپ کو پتا ہے کہ جو operating system کوئی ایک نہیں ہے دنیا میں بہت سارے operating systems ہیں windows آپ استعمال کر رہے ہیں اسے پہلے دوز تھا کئی مشینے جو ہیں pc وہ dos پہ ابھی تک چل رہے ہیں پھر macintosh ہے apple والوں کو computer اس کا اپنے operating system ہے mac os اب وہ line x کے اوپر چلا گیا which is like a variant of unix پھر unix کی اپنی پوری variety ہے unix بھی ہے line x بھی ہے son والوں کا solaris بھی ہے پھر main frame والے operating systems ہیں ایک چیز بڑی انٹرسٹنگ ہے the majority of these operating systems i'm not saying all but the majority has some kind of a c compiler available for it because c is a very elegant operating systems language بہت پوپلر ہے ہر پلٹفون پے مل جاتی ہے فرق کیا آتا ہے کہ جی کہیں پے کوئی constant جو ہے وہ تھوڑی جگہ لیتا ہے کہیں پے زیادہ جگہ لیتا ہے کہیں پے values اولتاکے لکھی جاتی ہیں کئی دفعہ سیدی لکھی جاتی ہیں کہیں پے انٹیجر 4 بیٹ لیتا ہے کہیں پے 8 بیٹ لیتا ہے and so on by and large وہ source code جو ہم اپنے programs کے اندر لکھتے ہیں وہ چینج نہیں ہوتا from machine to machine جو چیز چینج ہوتی ہے وہ یہی ہی ہیدر فائلس ہیں ہیدر فائلس essentially belong to the machine جب بھی ہم system ہیدر فائلس کی بات کر رہے ہیں اگر وہ my header dot h کی بات ہو رہی ہے جو ہم نے لکھا ہے وہ تو ہمارے source code کے ساتھ ہی جائے گا لیکن i o stream لے لے standard live لے لے standard i o dot h لے لے string dot h لے لے that may have subtle variations from machine to machine the nice thing is that over the years جس طرح سے یہ see compilers evolve کرتے رہے ہیں ان کی یہ library یا ہیدر فائلس کے نام جو ہیں یہ بھی standard بن تے رہے ہیں so میں نے دیکھا ہے آپ میں سے کئی جو ہیں ہمیں mail بھیجتے ہیں کہ جی وہ کوئی اور compiler استعمال کر رہے ہیں تو آپ نے دیکھا کہ ان compilers میں بھی ہیدر فائلس یہی ہیں i o stream dot h ہے یا con i o dot h ہے یا standard live dot h ہے same applies to operating systems as you change operating systems and you come up with the local version of the c or c plus plus compiler فائلوں کے نام یہی رہتے ہیں so if you were to take your code and port it to the other machine normally آپ کو اپنے پروگرم کے اندر کوئی چینج کرنے کی ضرورت نہیں ہے وہ automatically اس مشین environment کی include فائل جو ہے جو ہیدر فائل ہے وہ include کر لے گا and the program will compile and in 99% of the cases run without any errors ہاں ایک فیصد وہ ہے جہاں پہ کوئی behavioral change آ جاتی ہے ایک behavioral change میں نے انچن بھی کی تھی کہ جی get che جو ہے وہ کئی دفعہ صرف کی سٹروک کے اوپر ایک character پر لیتا اور کئی دفعہ کی سٹروک اور پھر انٹر بھی دبانا پڑتا ہے پھر جاکے وہ character پڑتا ہے that's a behavior change depends on the platform that you are using nonetheless using these header فائلس leads to a lot of portability so you can use the system header فائلس and not carry them with you with you when you change programs from one operating system to another operating system on the other hand جو آپ کی اپنی بنائی ہوئی header فائل تھی وہ بھی portability میں ہم کو ہمیں assist کرتی ہے in the sense that کہ اس ہیڈر فائل کے اندر آپ نے آپ نے جتنے بھی خود functions لکھے تھے ان کے proto طائف دال دیے ہیں جتنی definitions تھی جو آپ کا program استعمال کرتا ہے ان کو شارپ دیفائنس کے ساتھ آپ نے دال دیا ہے کوئی macros لکھیں ہیں وہ اس میں دال دیے ہیں بار بار رپیٹ کرنے کی ضرورت نہیں ہے and usually what happens is that as we evolve as programmers we start creating a few standard header فائلس for ourselves because of the style in which we work ہمارے style میں ہم چاہتے ہیں کہ جی ہم اس طرح سے define کریں گے یہ کچھ common functions ہیں جو بنالی ہیں ہم نے تو یہ ہمارے library functions بن گئے ہیں یہ ساری چیزیں ہم my header.h یا جو بھی نام آپ اپنے لیے create کریں اس کے اندر ہم دال دیتے ہیں اب جب بھی ہم operating system یا machine چینج کر رہے ہیں تو یہ ہیڈر فائل ہمارے programs کے ساتھ چلی جاتی ہے یا آپ نے کسی اور program machine کیوں پر بیٹھ کے کام ہی کرنا ہے تو آپ اپنی ہیڈر فائل لیایں گے بھی میں تو اپنا سارا یہ کام کیا ہوا ہے نیا program جو لکھنا ہے اس میں یہ include کر لو so it is quite useful to be able to organize your work in terms of these header فائلس now less useful but more tricky تھوڑا سے آپ کو example دیتا چلو مزے کا example دیکھیں میں نے mention کیا کہ sharp define ایک ایسی جادو کی چیز ہے کہ اس کے بعد جو بھی symbolic name لکھا جائے گا and then it's definition that definition will replace wherever the name is used in your code اگر آپ بہت زیادہ creative ہیں here's a challenge for you sharp define کے ساتھ آپ اپنی کوئی vocabulary define کریں جس کے اندر آگے code لکھا ہو see کا code remember it's ordinary substitution everything you write after the sharp define symbol name space دیکھے آگے جو چیز لکھیں گے وہ as is replace ہو جائے گی challenge میں اس پاس دے رہا ہوں کہ میں نے دیکھا ہوا ہے ایک جگہ پے کے جی ایک header فائل include کی ہوئی ہے اور نیچے ایک نظم لکھی ہوئی ہے it looks like an ordinary poem but every word in the poem ہے ایک جانب ہے کے بہت دیکھا ہے ہی شارف دیکھا ہے اور ہر see نبہ لکھا ہے پوئیم کہا ہوتے ہیں ہower she کا پرگرم ہے ایک دیکھا ہے تک کہ جانب رہے ہیں باتوں پر لکھیں ہی لیکن جانا ہوتے ہیں but you notice that when we do a sharp define ان start using header فائل you can do some very interesting things نیچے دن ہوتے ہم منصد ہیں کہ ایک شارف تک بہت جو آپ کو پوائنٹرز کی پاور وہ نظر آنے لگ بڑے گی اس وقتا کے لیے جازت دیجے خدا حافظ