 آسلام علیکم. 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 write. یہ بھی بہت ایک چیز ہے کہ آپ کو سمجھ بھی آیا آپ کیا لکھ رہے ہیں اور پھر سپیسفک کوئی آپ نے لیے problems لیں بک کے اندر بھی بہت سارے problems دیے ہوئے ہیں اور ان کو بھی exercise کے طور پہ آپ ٹریٹ کریں and become proficient in the use of code. آج ہم جو topic ڈرس کرنے جا رہے ہیں وہ ہے pre-processor کا اور header files کا. آج کا ہمارا agenda جو ہے وہ ہم pre-processor کے بارے میں بات کریں گے اس کے directives کی بات کریں گے دیکھیں گے یہ کرتا کیا ہے اور کیوں استعمال ہوتا ہے اور اسی کے ذریعے ہم آگے چلکے header files کی بات کریں گے جو آج تک آپ استعمال ضرور کرتے آئے ہیں لیکن ہم نے اس کو ایک اسم کام magic رکھا ہوا تھا کہ یہ آپ یہ لکھ دیں آگے کام چل جائے گا آج ذرا اس کے اندر ہم کھول کے header files کو بھی دیکھیں گے کہ ان کے اندر کیا ہوتا ہے پھر ہم اینی header files کے طور میکروز کی بھی بات کریں گے which is like code substitution جسے ہماری زندگی کچھ حد تک آسان ہو جاتی ہے اور ایک minor topic ہے related اسی طریقے سے define کرنے کا ان کی ہم بات کریں گے تو آئے پہلے ہم pre processor کی بات کرتے ہیں c جو ہے وہ ایک بڑی کونسائیسی لنگوڈ ہے چھوٹی لنگوڈ ہے اس کو انہانس کرنے کے لیے ہمارے پاس ایک pre processor بھی ہے یہ ہر کی c compiler کے ساتھ آتا ہے pre processor کرتا یہ ہے کہ جی compile کرنے سے پہلے اگر آپ نے program کے ساتھ کچھ manipulation کرنی ہو تو یہ pre processor ایکشن میں آتا ہے یہ code کو کچھ تبدیلیاں کرتا ہے اس کے اندر کوئی چیز شامل کرتا ہے یا کوئی definition include کرتا ہے اور پھر جاکے compiler کو وہ فائل ملتی ہے عام طور پہ ہمیں یہ نظر نہیں آتا کہ جن آپ کیا چیز include ہوئی ہے کیونکہ کوئی intermediate file ہمارے ہاتھ میں نہیں آتی but nonetheless there are lots of usages of this pre processor ابھی تک ہم جو بات کرتے آئے ہیں آپ کو یاد ہوگا کہ جی sharp include کا ایک directive تھا وہ ہم ہر program سے اوپر لکھتے تھے something like sharp include iostream.h اور ہم نے کہا تھا کہ یہ جادو کی چیز ہے ابھی آپ لکھلے ہم بعد میں بات کریں گے iostream کی ابھی باری نہیں آئی وہ ہم پھر اور اس کو دلے کرتے ہیں ابھی آگے چاہتے ہیں کہ اس کو دسکس کریں گے لیکن آج یہ sharp include والی جو بات ہے اس کے بارے میں we would like to discuss a little bit pre processor کرتا کیا ہے دیکھیں جب ہم اس کسم کا کوئی directive دے دیتے ہیں جہاں پہ ہم لکھتے ہیں کہ sharp include فلانی چیز تو وہ جو فلانی چیز ہے which usually is a text file it's an ordinary text file لیکن اس کے اندر لکھا ہوتا کوئی ترطیب کی چیز لکھی ہوتی i.e. see کا code ہوگا وہ جہاں پہ یہ لائن program کے اندر ہم لکھتے ہیں sharp include والی اس جگہ پہ وہ پوری کی پوری فائل وہ شامل ہو جاتی ہے as i said earlier یہ شامل ہوئی فائل وہ ہمیں نظر نہیں آتی لیکن compiler کو ضرور نظر آتی ہے so when the compiler starts compiling it sees all of the things in that file almost all of the directives of the pre processor they begin with the sharp sign that hash symbol your keyboard پہ ملتا ہے so every line starts with the sharp دو میجر چیزیں ہیں جو کہ ہم pre processor 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 کی ہے بہت ساری فائلیں جو ہے وہ ہم exercises میں استعمال کرتے رہے ہیں اور سب کے نام جو ہیں وہ ہم نے 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 والے pain کے اندر آپ کو کئی اس کے sub folders نظر آئیں گے ان میں سے ایک sub folder وہ include کا sub folder ہے اس کو اگر 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 آپ نے رفر کرنا ہو یا function call کرنی ہو تو function کا prototype وہ پہلے دفعین کرنا لازمی ہے یعنی compiler کو یہ پتا ہونا چاہئے کہ function کا نام کیا ہے اس کے argument کیا ہے اور یہ return کیا کرتا ہے یہ چیزیں پتا ہوں گی تو پھر وہ پہلا پاس compilation کا وہ اس سے گزر سکتا ہے جہاں تک رہی بات کہ وہ function کا ہمارے program کے اندر شامل ہوگا normally functions یا laboratory functions وہ علیدہ سے compiled libraries میں پڑھے ہوتے ہیں وہ linker کا کام ہے کہ جی اس وقت جب آپ کا object code بن گیا یعنی source code سے compiler نے پہلہ پاس کر لیا اور 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 نہیں آئی تو کم از کم اس کی declaration یعنی prototype آ گیا ہو تاکہ function کی شکل نظر آ جائے جب تو ہم اپنے function لکھ رہے ہیں تو ہمارے پاس یہ دونوں options ہیں کہ ہم function پھر ہم main کی اندر آئے جہاں پر ہم نے یہ function استعمال کرنا ہے and we go on like that in which case the definition of the function جو اوپر ہم نے لکھی ہے وہ prototype کا بھی کام کر دیتی ہے اور definition کا بھی کام کر دیتی ہے دونوں کام ہو جاتے ہیں main کی اندر ہم وہ line لکھ سکتے ہیں جہاں وہ function call کر رہے ہیں اور compile کرتے وقت وہ function بھی compile ہو جاتے اور main بھی compile ہو جاتا ہے link کریں اور چلا لیں in case and as the programs become big یہ مشکل ہو جاتا ہے کہ یہ سارے functions پہلے اوپر دیفائن کیا جائیں کئی دفعہ ہم کرتے ہیں کہ functions ایک علیادہ فائل میں دیفائن کر دیتے ہیں اور اس کو علیادہ سے compile کر کے object file بنا لیتے ہیں اور main کی اندر صرف وہ functions استعمال کرنا چاہتے ہیں اس case کی اندر ہم function کی کیونکہ definition now کسی اور فائل میں یا کہیں اور پڑی ہوئی ہے ہم چاہتے ہیں کہ functions کی declarations اوپر آجائیں وہی بات کہ اگر یہ program ہمارا یہ complex ہو گیا اور اس کے اندر bc of functions ہیں تو یا تو آپ main کے اوپر وہ bc of definitions یا prototypes لکھیں اور پھر جاکے main کی body وہ لکھنی شروع کریں دوسرہ طریقہ یہ ہے کہ آپ اپنی خود header file ایک بنا لیں so you can call it something like my header.h یہ جو file ہے اس کے اندر کچھ بھی نہیں ہوگا صرف function prototypes listed ہوں گے یہ functions prototype لکھ کے اس فائل کے اندر آپ اس کو سیب کرنے ordinary text file کے طور پے اب جب آپ main لکھنے آتے ہیں تو اس میں جو system requirements یا نیشاب include iostream.h اگر آپ نے input output کرنی ہے وہ تو آپ لکھ لیں گے اس کے بعد آپ شاب include کے ساتھ my header.h بھی بیچ میں لکھ دیں گے normally کیونکہ یہ فائل جو ہے ہمارے کسی foldر میں پڑی ہوتی ہے اور normally اس foldر میں جہاں ہمارا main program پڑا ہوا ہے اس وارثتے اس کو angle brackets میں include نہیں کیا جاتا اس کو double quotation marks کے اندر include کیا جاتا ہے double quotation marks میں جب ہم فائل کا نام دیتے ہیں تو include جو ہے وہ current working directory کے اندر اس فائل کو دھونتا ہے so keep that difference in mind کہ when we include the name of a file in angle brackets then the c compiler looks in a specific location وہ location جو کہ compiler کو پتا ہے کہ include files اگر آپ dev c++ میں ہی دیکھیں تو آپ کو tools کے نیچے options کا ایک ملتا ہے اور choice جہاں پہ پورا دیلوگ بوکس کھلتا ہے جہاں پہ آپ اس کو بتا سکتے ہیں کہ include files کہاں ہیں اور باکی چیزیں کہاں ہیں اور library's کہاں ہیں وہ جو وہاں include files کی directory یا foldر کا نام پورا لکھا ہوا ہے وہ جو ہے وہ ہے the one code ہے وہ شہد my documents میں سیب ہو رہا ہو اگر وہ وہاں پے ہو رہا ہے تو ہماری header file بھی ہم اسی foldر کے اندر رکھیں گے اور اس کا نام جو ہے program کے اندر وہ double quotation marks کے اندر شامل کریں گے angle brackets کے اندر نہیں کریں گے اب اس کا effect کیا ہوتا ہے جب ہم نے یہ compiler کو کہا کہ جناب ہمارا program compile کرو تو وہ پہلے sharp include directives کو دیکھتا ہے یہ جو directives ہوتے ہیں سب سے پہلہ directives کہتا ہے sharp include angle brackets میں io stream.h تو وہ del C++ یا جو بھی آپ C compiler استعمال کر رہے ہیں اس کے include directives میں جائے گا اور دیکھے گا کہ the io stream.h کہاں پے ہے اور پھر اس کو io stream کو as a text file اب سمجھ لیں پوری کی پوری آپ کے program کے اوپر وہ شامل کر دے گا so in a way your source code is expanding next line اس میں جو file لکھیو ہے وہ ساری include ہوگی in the same order یعنی io stream اگر اوپر لکھی تھی تو پہلے io stream.h آئے گی اس کے بعد شہد آپ نے fstream.h لکھا اس کے بعد fstream.h کا code آئے گا اس کے بعد اگر آپ نے لکھتی my header.h تو جو my header.h لکھا وہ اس کے اندر آجائے گا پھر آپ کا اپنا program آئے گا اور یہ ساری جو بڑی اس کو کمپائل کرو لیکن آپ کارفاو اور آپ پر اندرسٹن کہ یہ ان اردر اف دیفنیشن ہوتی ہے ایک پر نیگی حیرت ہمیں آپ کا program اس وقت بہت پہل چکا ہے لکہ ہمیں تو انٹ پے جاکے ایک سیکوٹنبل مے لیگی اب ان کے اندر یہ بھی دیکھنے والی بات ہے کہ یہ include فائل صرف اوپر آسکتی یا program درمیان میں بھی داری جاکتی There is no requirement that the include file is only above the program. No limitation. Normally we include it because they are headers. We don't define a code segment somewhere else and include it. It can be done but that is not the practice. Besides that, we don't have any other directives. We have also discussed a sharp include. One of the other major directives is the sharp define directive. With the sharp define, you can define macros. Macro, we say that a special name which can be substituted to be included in something. Macro's work is one or two that we have used. Otherwise, let's talk about them now. For example, we are writing a program in which we need the value of pi. Pi is like as you know a universal constant 3.1415926. And it is going on and its values are calculated in computers. But it is a constant. Instead of having the value of pi in our code, we are writing this value there 3.1519 whatever. اس سے بہتر یہ ہے کہ شاہد ہم ایک جگہ پے کہیں پے پای ڈیفائن کر دیں. آپ کہیں گے کہ یہ ہم ایک ویریبل سے بھی کام کر سکتے ہیں. بالکل صحیح ہے کہ آپ ویریبل کے ساتھ بھی آپ کہہ سکتے ہیں ڈبل پای اور پھر یا وہی پے اس کو اسائن بھی کر دیں value یا آگے جاکے آپ لکھنے پای equal to something اور پھر پای کو استعمال کر دے رہیں. No problem but the actual situation is کہ اس طرح اگر آپ پای ڈیفائن کریں گے just an ordinary variable. If it is a variable تو اس کی value reassign بھی ہو سکتی ہے. ہم چاہ رہے ہیں کہ جہاں پے بھی ہم پای لکھیں وہاں پے پای کی natural constant اس کی value آئے اور کوئی value نہ آئے. تو ہم کیا کرتے ہیں ہم program کے اوپر یہ ایک لائن لکھتے ہیں شاہپ ڈیفائن اور ڈیفائن پورا ڈیزی کا word ہے which means define whatever I am saying. اور اس کے بعد جو بھی ہم سمبالک ڈیم استعمال کرنا چاہتے ہیں وہ نام لکھتے ہیں in this case پای p i اور پھر یہ بھی convention ہے کہ جب ہم اس طرح کے نام لکھ رہے ہیں تو ان کو full capitals میں لکھیں. اس کا فیضہ یہ ہوتا ہے کہ code میں جہاں پہ ہم یہ variable یا رڈ سے سمبالک constant not a variable. سمبالک constant یہاں پے بھی ہم استعمال کر رہے ہیں وہ ہمیں نظر آ جائے گا آسانی سے. تو ہم نے لکھا شاہپ ڈیفائن پھر capitals میں لکھا پای اور پھر space دیکھے ہم نے لکھا 3.1415926 یا whatever value we want to assign to this constant اب یہ جو ہے pre processor اس کے ساتھ کیا کرتا ہے pre processor یہ کرتا ہے کہ جب آپ کہتے ہیں code کو کہ اس کو compile کرو تو پہلے دیکھتا ہے کہ شاہپ defines کون سے ہیں ایک تو شاہپ includes کیا میں نے بات کی وہ فائلیں کی فائلیں جو ہے پورا text جو ہے اس میں include ہو گیا اب وہ یہ کرتا ہے کہ دیفائن کے ساتھ جو بھی آپ نے نام لکھا بے وہ جہاں جہاں code میں آتا ہے وہاں پہ نام replace ہو جاتا ہے it is replaced with the value of the name assigned with the شاہپ defined statement so in a way compiler کو پای نظر نہیں آتا compiler کو جہاں جہاں ہم نے source code کے اندر پای لکھا تھا وہاں پہ 3.14159 ہی نظر آئے گا اب اس کا فائدہ کیا ہے نقصان کیا ہے سب سے بڑا فائدہ تو یہ ہے کہ سپس ہم نے program لکھنا چورو کیا تو اس وقت پای کو define کیا ہے is 3.14 بچوں والی definition 2 decimal places تک اس کے بعد جب ہم نے کوئی computation کیا اور ہم اپنے results کو دیکھنے لگے تو لگا کہ یہ تو کافی accurate نہیں ہے بہتر یہ تھا کہ ہم پای کی value کو 4 decimal places تک لے جاتے اب دیکھیں اگر ہم نے پای کی value code کے اندر ہر جگے پہ لکھی ہوتی ہے as 3.14 تو آپ search and replace کر رہے ہوتے اور اس کو replace کر کر کے ہر جگے پر اس کو 3.1415926 لکھ رہے ہوتے problem کہیں نا کہیں کوئی value miss بھی ہو سکتی ہے ایک دوسرا کہ شہد 3.14 کہیں اور لکھا ہو کسی اور وجہ سے اور وہ پای نہ ہو کوئی اور constant ہو میں tax rate ہو اگر کسی نے funny tax rate رکھا ہوا ہے اور اس کو بھی ہم پای کی value کے ساتھ ہی بدل دیں so you can't do a blind search and replace and expect it to work its much nicer کہ پای اوپر ہم نے define کیا ہے اور نیچے pi جو symbol ہے وہ استعمال کر رہے ہیں code کے اندر جب ہم نے value کو update کرنا ہے بدلنا ہے یا اس کو زیادہ decimal places تک استعمال کرنا ہے تو program میں ایک جگہ پہ جاکے ہم نے pie کی value بدل اور پھر جب کمپائل کریں گے تو ہر جگے پہ وہ value substitute ہو جائے گی اس چیز کا خیال دکھیں کہ جب ہم sharp define کے ساتھ کو اس طرح symbolic name جو ہے وہ associate کرتے ہیں تو وہ actual code میں substitution ہوتی ہے before it goes to the compiler this gives us very nice control کہ جی ایک جگہ پہ value بدلی پورا program جو ہے وہ update ہو گیا اس کو combine کریں sharp include کے ساتھ کہ جی ہم نے ایک my header.h بھی لکھی تھی اپنی header file تو کیونہ پای کی definition header file میں ہی دال دیں اس کا فیدہ کیا ہوگا جہاں جہاں وہ header file استعمال ہوگی وہ automatically pie کی نئی value جو ہے وہ وہاں پے updated ملتی رہی گی آپ کے program کو for example اگر آپ کے پاس 5 functions ہیں اور 5 functions کے اندر pie استعمال ہونا ہے اور آپ نے ان کی علیدہ علیدہ source code files بنائیں گے رادہ دن ایک لمبی file کے تو آپ کو 5 جگہ پے sharp define pie 3.14 اٹسیٹرہ کرنا پڑے گا وہ بھی آپ header file میں لے جائیں اب اگر آپ نے value update کرنی ہے تو صرف آپ نے header file کو update کریں جب بھی آپ program کو recompile کریں گے everything will be updated so it's a nice way of doing things ایک چیز کلیر کرتا چلو یہ جو ہمارے pre-processor directives ہیں sharp include, sharp define یہ c کی statements نہیں ہیں since they are not c statements ان کے end پہ ہم semi colon نہیں لگاتے اس کیز کا خیال رکھیے گا otherwise that becomes like a syntax error یا کچھ اجیب کسم کے side effect ہونے شروع ہو جائیں گے صرف یہی دو pre-processor directives ہیں نہیں کافی سارے اور ہیں یہ list بھی آپ دیکھلی جا آپ کے hand out میں بھی دی ہوئی ہے شاہل رہے کہ pre-processor directives سب جو ہیں وہ sharp sign کے ساتھ شروع ہوتے ہیں اس کے ساتھ ہم conditional compilation بھی کر سکتے ہیں if بھی ہے ہمارے پاس sharp if else sharp end if اور اگر else if استعمار کرنا چاہیں ہم تو اس کے لیے sharp el if یہ بھی چلتا ہے اس کے بعد ہم یہ بھی چیک کر سکتے ہیں کہ جی کوئی symbol جو ہم نے define کیا ہوا ہے کہ نہیں so we can say if def اور اگر define کیا ہوا ہے جیسے ہم نے pie استعمال کیا تو we can always say کہ جی if sharp if def pie which means اگر pie define ہوا ہے تو پھر یہ کرو تو اور نیچے کچھ اور ہمارے پاس statement سا جائیں گی یہ conditional compilation کی اندھا چلی جاتی ہیں دوسی چیز جو important ہے کہ for example اگر pie already defined ہو جنی sharp define pie کہیں پے کیا ہوا ہے تو it is an error to try and define it again اس باستے اس کو پہلے undefine کرنا لازمی ہے اور undefine کے لیے sharp undef آجاتا ہے so کافی سارے ہیں جو pre-processor directives ہیں اور conditional compilation کے اندھر ہمیں جو فائدہ ملتا ہے وہ یہ ہے جب آپ کا project بڑا ہو جاتا ہے آپ چاہتے ہیں کہ اس کو debug کرنا چاہیں اور debugging کے اندھر ایک common technique ہے کہ جی آپ کوئی output statements screen پے لکنا شروع کر دیں 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 اور نیچے جاکے ہم sharp if کے ساتھ کہیں کہ اگر defined ہے if depth debug تو پھر یہ output سٹیٹ میں چلا دو sharp and if اب فائدہ یہ ہوگا by the way اب دیکھیں میں نے کیا کیا کہ یہ sharp define debug پہلے جو ہم نے sharp define کا اگزانپل کیا تھا اس کے اندر pie کو ایک value دی تھی ضروری نہیں ہے کہ sharp define کے ساتھ value دی جائے صرف یہ کہدنا sharp define pie مینس کے ایک symbol pie جو ہے وہ define ہو گیا اس کی value کوئی نہیں ہے but it exists as far as the compiler is concerned اسی طریقے سے جب ہم تست کرنے جاتے ہیں کہ if depth if defined ہم لکھ سکتے ہیں آگی pie obviously that is too contrived لیکن debugging کے حوالے سے دیکھیں ہم کہتے ہیں sharp define debug اب debug ہم نے پورہ capitals میں لکھ دیا کوئی value نہیں دی لیکنیچے جاکے اگر ہم یہ لکھیں گے sharp if def debug تو that will return true کیونکہ debug defined ہے so 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 undefined کرنے کے لیے وہی undef کا ہمارے پس macro ہے تو آپ sharp undef اور آگے جو بھی 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 اگر کرنا ہو تو اس کو undefine کرنا ضروری ہے پرکٹس کے لیے what I would strongly recommend is کہ آپ کچھ ہیڈر فائلز کو کھول کے دیکھیں for example آپ نے ایک assignment بھی کی تھی اس کے اندر ہم نے con I.O you have console input output یہ پرانے زبانے کی legacy ہے اور جو ہمارے کیبورد والے systems and the ones not using graphical user interfaces وہاں پہ ہم یہ استعمال کرتے ہیں so con I.O کینا دو ورایتیز آپ کے پاس موجود تھیں dev C++ میں کمس کم وہاں پہ con I.O.H بھی تھی as a header file اور ایک اس کا ویرین تھا con I.O.C ان کو آپ کھولیں ایڈٹ نہ کیجے گا کچھیز چیج نہ کیجے گا شہد کمپائلر کام کرنا ہی بند کر دے اجیب کسم کے ایفیکٹs آجائیں بہر اس کو پرنے کی کوشش کریں initial impact یہ کیا چیز کھولی گھبرانی کی بات نہیں ہے actually you now have enough knowledge to actually read it line by line if you look at it you will find strange symbols کوئی نام ہے کسی ویریبل کا یا کنسٹنٹ کا انہوں استعمال کیا ہوا تو you might find کہ اس سے پہلے underscore characters لگے میں underline والا میں ایک لیکچر میں پہلے بھی ذکر کیا تھا کہ بہت سارے internal constants ہیں یا internal symbolic names جو ہیں جو compilers ہمارے استعمال کرتے ہیں ان کا نام normally double underscore کے ساتھ شروع ہو رہا ہوتا ہے لہذا it is good programming practice کہ ہم اپنے لیے کوئی ایسے variables استعمال نہ کریں جن کا نام جو ہے وہ 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 یہ کون آئیو کے اندر آپ کو get ch e کی definition بھی ملے گی ایک فائل میں get ch e parenthesis which means it's a declaration دوسی فائل کے اندر اس کا پورہ code بھی دیا ہوا ہے 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 کرتے ہیں پوری فائل آپ کے program کے اندر چلیگی اور وہ define چیزیں آپ کے program کو available ہو جاتی ہیں کہ اگر con i o dot c یا con i o dot h آپ include نہیں کرتے آپ نے source میں اور آپ وہاں پے کہی پہ جاکی کہتے get ch e which is get character with echo for those of you are interested کہ جب ہم کی دبائیں تو وہ echo بھی کرے screen پہ بھی نظر آئے کہ ہم نے کونسا بٹن دبائے ہے so get ch e اگر ہم نے program میں لکھا اور اوپر include نہیں کی فائل تو you will get a compiler error وہ جو نیچے والا آپ کی error کے اندر وہاں پے آگیا آجائے گا something like get ch e not defined اس وجہ سے کہ ہم نے وہ header فائل include ہی نہیں کی جس کے اندر اس function کی 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 کر کے اگر دیکھیں تو لگتا یہ ہے اگر کوئی چیز 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 اور اس if def کے ساتھ closing curly bracket دلہ ہوگا تو یہ اگر example ہے 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 ان کے ایک سرسی نظر رزور گزارے so that you can see کیجی how professional programmers یا programmers جو کے compilers لکھ رہے ہیں وہ کس طرح سے code لکھتے ہیں اگر آپ کے پاس line x operating system ہو it is free اور اس کا source code بھی free ہے وہ سارہ see میں لکھا ہوا ہے you can take a look at the functions written by the gurus or the see gurus جو کے actually لکھ رہے ہیں آپ کو مل جائے گا string compare کا مل جائے گا and it is a good idea to read how the master's write code شد آپ کا style بھی جو ہے وہ اس کے ساتھ affect ہو let's go on and look at a real macro macros جو ہیں وہ دو مختلف varieties میں آتے ہیں ایک macro ہم استعمال کر چکے ہیں وہ تھا sharp define pie اور آگی اس کی value دے دی اور یہ actually macro اس طرح کے جو سیمپل macros ہیں which are more like symbolic names being mapped onto constants وہ دو ہم عام طور پہ استعمال کرتے ہیں لیکن ایک اور قسم کا macro ہے جو کہ argument بھی لیتا ہے یہ نہیں it's a parameterized macro for example اگر میں یہ ایک macro لکھوں sharp define square اور parenthesis کے اندر x اب میں چاہی رہوں کہ اس کے بعد x star x remember یہ pre-processor میں لکھ رہے ہیں یہ c کا source code نہیں ہے لہذا یہاں پہ semi colon نہیں دا لیں گے ہوگا یہ کہ جہاں پہ بھی آپ کے program میں آپ نے لکھا square something تو compilation سے پہلے ہی آپ نے لکھا وہاں پہ جاکے let's say square i تو یہ macro وہاں پہ replace کر دے گا i star i وہاں پہ لکھا جائے گا square غیب ہو جائے گا full substitution ہو جائے گی جب i star i لکھا گیا پھر آپ نے program وہاں کمپائلر کو دیا اور اس نے کمپائل کر کے executable code بنا دیا اب اس کے اندر تھوڑی سی problems آ جاتے ہیں problems کیا آتے ہیں suppose میں نے یہی definition اوپر لی کہ square x اور اس کی define کر دیا x star x نیچے جاکے میں نے کہا square اور parenthesis آپ ذرہ 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 اس کو کیسے overcome کیا جائے اس کو overcome کرنے کا طریقہ یہ ہے جب بھی آپ کوئی parameterized macro لکھیں تو جہاں پہ آپ نے لکھا square x اور parenthesis کے اندر x آگے جب definition کی باری آتی ہے تو پہلے تو آپ پوری definition کو parenthesis میں دال دیں so x star x آپ parenthesis کے اندر اب کیا کریں کہ x کو بھی parenthesis میں دالے so it starts reading like sharp define square parenthesis x parenthesis closed پھر space دیکھے open parenthesis اور پھر x جو ہے وہ parenthesis کے اندر آئے گا پھر star آئے گا یہ نہیں multiplied با ہے اور پھر parenthesis کے اندر x آئے گا and parenthesis closed اب اس کو ذرا غور سے دیکھیں گوڈ میں لکھتی a square اور parenthesis کے اندر i plus j وہاں پہ کیا ہوگا کہ وہ parenthesis بھی یہاں پہ copy ہو جائیں گے 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 اب what is the difference between using this square x with a function called square x کوئی فایدہ نقصان آپ کو نظر آتا ہے you see whenever we call a function تو compiler نے بھی کچھ کام کرنا ہے لیکن program جب چل رہا ہوتا ہے اس وقت کافی سارا کام کرنا پڑتا ہے آپ کو تھوڑا سا idea ہوگا ابھی تک میں خیلہ introduction to computing میں بھی اس کے بات ہوئی تھی یہ سٹاک بیست مشین ہے یعنی پوری میمری کو it makes it appear like a stack اور ہوتا ہے کہ جی ایک program کی جو state ہے اور state ہم کہتے ہیں جو اس کے جتنے بھی variables ہیں ان کی جو بھی values ہیں اس وقت program کہاں پے ہے اس کا line number and so on وہ سٹاک پے پڑا ہوتا ہے اور اس پے save کر کے پھر ہم وہاں پے کوئی argument یا parameter جو بھی لکھنا ہے وہ لکھ کے پھر ہم function کو call بھی دیتے ہیں چلتے چلتے ایک دم یہاں پے رک جا اور یہاں پے جاکے کچھ کام کرو اور جب کام ختم ہو جائے گا تو واپس آکے یہاں سے آگے کو چل پڑنا جب ہم function call کرتے ہیں we go off to another place in the code the code picks up the value from the stack does some computation and then comes back returns the control to the main program اور وہ آگے کو چل پڑتا ہے what this means is that there is considerable overhead اس کا ہم overhead کہتے ہیں یعنی جب بھی ہم function کو call کرتے ہیں there is some extra work that needs to be done whenever we do a lot of function calls ایک loop ہے اس کے اندر function call ہو رہا ہے بار بار ہو رہا ہے تو یہ overhead ہر دفعہ ہو گا یعنی جتنی دفعہ loop چلے گی اتنی دفعہ یہ overhead incur ہو گا and overhead کو آپ سمجھیں کہ یہ computer time ہے so time waste ہوتا ہے computing resources waste ہوتی ہیں now obviously ہمارے سی چیویشنس where we can't do without a function call we have to call those functions that is all right but in this simple example جس کی میں ابھی بات کر رہا تھا square کرنے کی اگر square کو میں as a function call treat کرو or program would 10,000 times square کا function call کرے تو a considerable time is wasted instead of that if we were to define square as a macro the way we have done what happens is کہ وہ والا کوٹ جو تھا x star x وہ substitute ہو جائے گا in the code by expanding it in this example جو ہم لے کے چلے تھے کہ جی i plus j parenthesis کے اندر times i plus j in parenthesis وہ code کے اندر لکھا جاتا ہے یہ بھی the expansion happens before the code is compiled what that means is what the compiler sees is an ordinary multiplication and addition line it does not see a function call if it's not a function call there is no overhead it executes a lot faster اسی طریقے سے آپ ایک چلی جو parametrized functions یہ parametrized macros وہ کافی سارے complex آپ لکھ سکتے ہیں اور فائدہ یہی ہے کہ جب بھی آپ ان کو استعمال کریں گے function call سے بچائیں گے کام جو ہے زیادہ تیزی سے ہو جائے گا یہ نہیں it is faster execution lesser overhead اگر اتنا ہی فائدہ ہے ان کا macros کا تو ہم functions کیوں لکھتے ہیں حالا یہ سب سے سبتا ہے 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 are getting faster execution the downside is you got a bigger program اپنے اپنے ذخاہ بشکہ باڑی بنائی گی. اپنے اس پارٹ کومانے کی خواہات مصمرا کی مطالد ہوتا ہے اندیئے سب کامپلیکس بیٹر تن لیگayım مجھے ذکر تک اٹیدتے ہیں اپنے بلکتنے کو بہترے لگی لیکن اور سب ایک یک ways کامپلیکس ہے لیکن اپنے باکرے کی خواہات کرنے والا اچھا اور اربید اپنے دیفنشوں سے اسی طرح آنکتی ہے and let it be expanded as part of the pre-processor. جو چھوٹے چھوٹے پوائنٹس ہوتے ہیں چیزوں کے وہ میں منشن کرتا چلتا ہوں but you would also discover them by hit or trial but nicer to know. جب بھی ہم کوئی macro define کرتے ہیں جس نے argument لینے ہیں تو macro کے نام کے فورن بعد open parenthesis آجا نا چاہیے یعنی وہاں space نہیں دینی. جیسے ہی space دی تو وہ sharp define والا pie والی situation میں آپ چلے گئے کہ یہ نام ہے اس کی جگہ پر یہ substitute کر دو. ہم چاہ رہے ہیں کہ ایک 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 آپ کو پتہ ہے وہ pi 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 کرنا چاہیں اوپر اب دیکھیں اس کو logically ہم دو steps میں کرتے ہیں پہلے ہمیں pi کی ضرورت ہے pi بزاتے خود ایک natural constant ہے تو کیونہ اس کو بھی define کر لیا جائے تو کیوں کہ ہم pi کو استعمال کرنا چاہتے ہیں تو سب سے پہلے pi کو define کریں ہم کہتے ہیں sharp define space pi in capitals pi پھر سپیس دیکھیں pi کی value لکھتے ہیں the number which we want to use for pi اور وہ اتنی decimal places کا number ہوگا جتی ہم استعمال کرنا چاہتے ہیں یہاں بھی دیکھیں in float دبل نہیں چاہرے this is a constant so you can use 6 decimal places or 8 decimal places وہ computation کے اندر استعمال ہوں گی جب pi define ہو گیا next line کہتی ہے sharp define circle area again from a perspective of visibility it would be nice اگر آپ circle area پورا کا پورہ capitals میں لکھیں اب circle area جہاں اس کو ایک تو pi کی ضرورت ہے pi already defined ہے اور وہ natural constant ہے so it's no need to pass it to this function لیکن ایک چیز پاس کرنے کی ضرورت ہے وہ ہے radius تو radius کی جگہ پہ ہم parentheses کے اندر x لکھتے ہیں x بھی ہم capital لکھیں گے تاکہ وہ کلیر رہے کہ یہ آگے جاکے سبسیٹوٹ ہو جائے گا ہم نے لکھا sharp define circle area parentheses کے اندر capital x اور پھر space دیکھے circle area کی definition آ جائے گی اگر تو ہم definition simple لکھتے ہیں which is pi in capitals star x star x no semicolon تو یہ simple کام کر دے گا جہاں پہ بھی آپ 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 pi 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 pi star radius star radius with all the parentheses included and the answer of course is the object 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 two star radius and it will work کیونکہ یہ Multiplication ہے وہ Ordinary X without parentheses جانی تھی because we are saying pi star r star r so multiplication جو ہے وہ تو expand ہو جاتی ہے لیکن اگر کہیں پہ کوئی addition یا subtraction آجاتی تو parentheses کے بغیر یہ definition fail کر جاتی 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 ہیں لیکن آگے چل کے when you become professional programmers and you writing your own operating system you will learn more about them and use them properly for the moment یہ میں کہتا چلوں کہ آپ کو پتا ہے کہ جو operating system کوئی ایک نہیں ہے دنیا میں بہت سارے operating systems ہیں windows آپ اسٹمال کر رہے ہیں اسے پہلے DOS تھا کئی مشینے جو ہے pc's وہ DOS پہ ابھی تک چل رہے ہیں پھر macintosh ہے apple والوں کو computer اس کا اپنے operating system ہے macOS اب وہ linux کے اوپر چلا گیا پھر unix کی اپنی پوری ورایٹی ہے unix بھی ہے linux بھی ہے son والوں کا solaris بھی ہے پھر main frame والے operating systems ہیں ایک چیز بڑی interesting ہے 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 بہت popular ہے ہر پلاٹفوم پر مل جاتی ہے کہی پہ کوئی constant وہ تھوڑی جگہ لیتا ہے کہی پہ زیادہ جگہ لیتا ہے کہی پہ values ڈلٹا کے لکھی جاتی ہیں کئی دفعہ سیدی لکھی جاتی ہیں کہی پہ integer 4 bytes لیتا ہے کہی پہ 8 bytes لیتا ہے and so on by and large وہ source code جو ہم اپنے programs کے اندر لکھتے ہیں وہ change نہیں ہوتا from machine to machine جو چیز change ہوتی ہے وہ یہی header files ہیں essentially belong to the machine جب بھی ہم system header files کی بات کر رہے ہیں اگر وہ my header.h کی بات ہو رہی ہے جو ہم نے لکھا ہے وہ تو ہمارے source code کے ساتھ ہی جائے گا لیکن io stream لے لیں standard lib لے لیں standard io.h لے لیں string.h لے لیں that may have subtle variations from machine to machine the nice thing is that over the years جس طرح سے یہ c compilers evolve کرتے رہے ہیں ان کی یہ library یا these files کی نام یہ بھی standard بنتے رہے ہیں میں نے دیکھا ہے آپ میں سے کئی ہمیں mail بھیجتے ہیں کہ جی وہ کوئی اور compiler استعمال کر رہے ہیں آپ نے دیکھا کہ ان compilers میں بھی header files یہی ہیں io stream.h ہے یا con io.h ہے standard lib.h ہے same applies to operating systems as you change operating systems and you come up with the local version of the c or c++ compiler فائلوں کے نام یہی رہتے ہیں if you were to take your code and port it to the other machine normally آپ کو اپنے program کے اندر کوئی چینج کرنے کی ضرورت نہیں ہے it automatically اس machine environment کی include file جو ہے جو ہے header file ہے وہ include کر لے گا and the program will compile and in 99% of the cases run without any errors ہاں ایک بھی ست وہ ہے جہاں پہ کوئی behavioral change آجاتی ہے ایک behavioral change میں نے کہ جی گیٹ سی ہی جو ہے وہ کئی دفعہ صرف keystroke کے اوپر ایک character پر لیتا کئی دفعہ keystroke اور پھر انٹر بھی دبانا پڑتے پھر جاکے وہ character پڑتے that's a behavior change depends on the platform that you are using nonetheless using these header files leads to a lot of portability so you can use the system header files and not carry them with you when you change programs from one operating system to another operating system on the other hand جو آپ کی اپنی بنائی ہوئی header file تھی وہ بھی portability میں ہم کو ہمیں assist کرتی ہے in the sense that کہ اس ہیڈر فائل کے اندر آپ نے آپ نے جتنے بھی خود functions لکھے تھے ان کے prototypes ڈال دیے ہیں جتنی definitions تھی جو آپ کا program استعمال کرتا ہے ان کو sharp defines کے ساتھ آپ نے ڈال دیا ہے کوئی macros لکھیں وہ اس میں ڈال دیے ہیں بار بار repeat کرنے کی ضرورت نہیں ہے and usually what happens is that as we evolve as programmers ہمee start creating a few standard header files for ourselves because of the style in which we work ہمارے style میں ہم چاتی ہے کہ ہم اس طرح سے Own دفائن کریں گے یہ کچھ common functionsTER ہmente ہمیں بن Scholars یہ ساری چیزیں ہم my header.h یا جو بھی ناaires جب بھیookie اپنے computer is یا آپ نے کسی اور مشین کے اوپر بیٹھ کے کام ہی کرنا ہے تو آپ اپنی ہیڈر فائی لیاں گے بھی میں تو اپنہ سارہ یہ کام کیا ہوئے نیا پرگرم جو لکھنا اس میں یہ انکلوٹ کر لو so it is quite useful to be able to organize your work in terms of these ہیڈر فائیلز now less useful but more tricky تھوڑے سے آپ کو اگزامپل دیتا چلو مزے کا اگزامپو دیکھے میں نے منشن کیا کہ شاپ دیفائن ایک ایسی جادو کی چیز ہے کہ اس کے بعد جو بھی سیمبالک نیم لکھا جائے گا and then its definition that definition will replace wherever the name is used in your code اگر آپ بہت زیادہ کرییٹف ہیں here's a challenge for you شاپ دیفائن کے ساتھ آپ اپنی کوئی وکیبیلری دیفائن کریں جس کے اندر آگے کود لکھا ہو سی کا کود remember its ordinary substitution everything you write after the شاپ دیفائن سیمبالنیم سپیس دیکھے آگے جو چیز لکھیں گے وہ as is رپلیس ہو جائے گی challenge میں اس پاس دے رہا ہوں کہ میں نے دیکھا ہوا ہے ایک جگہ پے کہ جی ایک ہیڈر فائیل انٹلوڈ کی ہوئی ہے اور نیچے ایک نظم لکھی ہوئی ہے it looks like an ordinary poem but every word in the poem is actually دیفائنٹ میں the ہیڈر فائیل with the شاپ دیفائن اور it translates into c code so by writing a poem which reads as an English poem were actually see کا program here now that is carrying things a little bit too far but you notice that when we do a sharp define and start using hider file you can do some very interesting things next time we shall be talking about memory allocation which is where I hope آپ کو پوینٹرز کی پاور وہ نظر آنے لگ بڑے گی. اس وقتا کے لیے جازہ دیجے. خدا حافظ.