{"id":275,"date":"2015-02-05T19:50:17","date_gmt":"2015-02-05T17:50:17","guid":{"rendered":"http:\/\/ozenozkaya.com\/blog\/?p=275"},"modified":"2015-02-05T19:50:17","modified_gmt":"2015-02-05T17:50:17","slug":"gomulu-sistemler-21-etiketler-ve-makrolar","status":"publish","type":"post","link":"http:\/\/ozenozkaya.com\/blog\/?p=275","title":{"rendered":"G\u00f6m\u00fcl\u00fc C &#8211; 10 : G\u00f6m\u00fcl\u00fc C: Etiketler ve Makrolar"},"content":{"rendered":"<p>Bu g\u00fcnk\u00fc yaz\u0131mda, di\u011fer yaz\u0131larda da ucundan kula\u011f\u0131nda bir miktar bahsetmi\u015f oldu\u011fum #define ile tan\u0131mlanan etiketler \u00fczerinde duraca\u011f\u0131m. Her durumda etiketleme yapmak\u00a0do\u011fru olmayabilir, ancak C dilinde etiketler \u00e7ok \u00a0\u00f6nemlidir. Bu sebeple, \u00e7i\u00e7ek gibi kodlama yapmak i\u00e7in bu m\u00fcstesna \u00f6zelli\u011fi ne \u015fekilde kullanmak laz\u0131m ona de\u011finece\u011fim.<\/p>\n<p>Bunlar\u0131 ifade ederken, day\u0131yla olan an\u0131lar\u0131m\u0131zdan dem vuraca\u011f\u0131m. Yani bu yaz\u0131n\u0131n temas\u0131 bizim day\u0131.<\/p>\n<p>Etiketler diye adland\u0131rd\u0131\u011f\u0131m bu #define nanesi genel olarak iki temel amaca hizmet eder efem: etiketleme amac\u0131 ve fonksiyonel ama\u00e7. Her iki amac\u0131n da alt\u0131na yatan nane ayn\u0131 define nanesi oldu\u011fun i\u00e7in, nanenin iki \u00e7e\u015fit s\u0131k\u0131lm\u0131\u015f suyu da \u00f6z\u00fcnde ayn\u0131 tad\u0131 verir. Bu tad\u0131n g\u00fczel olmas\u0131 i\u00e7in bir iki p\u00fcf noktas\u0131n\u0131 akl\u0131m\u0131zda tutmam\u0131zda say\u0131s\u0131z faideler var. \u0130\u015fbu yaz\u0131da bu p\u00fcf noktalara dem vurulacakt\u0131r.<\/p>\n<p><strong>Etiketleme Amac\u0131yla Kullan\u0131m\u0131<\/strong><\/p>\n<p>Bu kullan\u0131m\u0131 esasen magic number coding k\u0131sm\u0131nda anlatm\u0131\u015ft\u0131m ama \u015fimdi biraz daha farkl\u0131 bir a\u00e7\u0131yla konuyu felsefi olarak irdeleyece\u011fim. #define ifadesinin etiketleme amac\u0131yla kullan\u0131lmas\u0131 esasen, verinin bilgiye d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi yani bir anlamda verinin bilgi olarak etiketlenmesidir.<\/p>\n<p>Hat\u0131rlay\u0131n, &#8216;A&#8217; karakteri de, emeklilik ya\u015f\u0131 da 65 say\u0131s\u0131 ile ifade ediliyordu. Yani burada iki farkl\u0131 bilgi, ayn\u0131 veriyle ifade edilebiliyordu. O zaman hangi verinin hangi bilgiyi etiketledi\u011fini bilebilmek i\u00e7in basit\u00e7e onu etiketlememiz gerekiyor \ud83d\ude42<\/p>\n<p>K\u00f6t\u00fc \u00f6rnekten \u00f6rnek olmaz ama, misal diye s\u00f6ze ba\u015flayarak bir k\u00f6t\u00fc \u00f6rnekle devam edelim.<\/p>\n<p><em>K\u00f6t\u00fc \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true \">uint8_t threshold;\nuint8_t class;\n. . .\nif(threshold &gt; 65)\n{\nclass = 65 ;\n}<\/pre>\n<p>\u015eimdi bu kodu yazan day\u0131 bir nane yemi\u015f yazm\u0131\u015f, belli ki de \u00e7al\u0131\u015f\u0131yor diye sonradan da bozmam\u0131\u015f. Hadi day\u0131 bu naneyi yemi\u015f, kimse de \u00e7\u0131k\u0131p dememi\u015f ki &#8220;Aga bu nedir?&#8221;. Ben gittim sordum, kodu yazan day\u0131n\u0131n amac\u0131, bir i\u015f\u00e7i e\u011fer 65 ya\u015f\u0131ndan b\u00fcy\u00fckse, o ilgili \u015firkette A s\u0131n\u0131f\u0131 bir \u00e7al\u0131\u015fan oluyormu\u015f. Yaz\u0131l\u0131m da \u015firket \u00e7al\u0131\u015fanlar\u0131n\u0131 bu anlamda kontrol edip etiketliyormu\u015f. Day\u0131 dedim bak bizim blogda b\u00f6yle b\u00f6yle mevzular var, bunun ad\u0131 magic number coding. Hadi biz g\u00f6rd\u00fck sineye att\u0131k, el-alem g\u00f6rse bu koda ne der? D\u00fczeltelim \u00f6yleyse dedi day\u0131, neye d\u00fczeltti\u011fini siz biliyorsunuz :).<\/p>\n<p><em>\u0130yi \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true \">#define AGE_TO_BE_RETIRED (65)\n#define AGE_TO_DRIVE_CAR (18)\n. . .\n#define WORKER_CLASS_A (' A' )\n#define WORKER_CLASS_B (' B' )\n#define WORKER_CLASS_C (' C' )\n#define WORKER_CLASS_D (' D' )\nuint8_t ageThresholdToBeRetired;\nuint8_t classOfTheWorker;\nif(threshold &gt; AGE_TO_BE_RETIRED )\n{\nclass = WORKER_CLASS_A;\n}<\/pre>\n<p>Neyse \u00e7\u0131kt\u0131m sonra day\u0131n\u0131n yan\u0131ndan, y\u00fcr\u00fcyorum. Bi bakt\u0131m arkadan biri &#8220;hooooop&#8221; diye ba\u011f\u0131r\u0131yor. D\u00f6nd\u00fcm bir bakt\u0131m yine bizim day\u0131. Day\u0131 bir disketi elime tutu\u015fturdu. Al dedi ye\u011fen, laz\u0131m olur. Neyse g\u00fc\u00e7 bela disket okuyuculu bir bilgisayar buldum ve i\u00e7indeki .c uzant\u0131l\u0131 dosyay\u0131 g\u00f6rd\u00fcm. Heyecanla dosyay\u0131 a\u00e7t\u0131\u011f\u0131mda, olan biteni hemen anlad\u0131m. \u00c7\u00fcnk\u00fc day\u0131 kodu d\u00fczeltmi\u015f, alemlere ibret olsun diye diske koymu\u015f. Yaz\u0131l\u0131m\u0131 okurken sanki \u015fiir okur gibi, her bir \u015feyi anlad\u0131m. E\u015f\u015fe\u011fi ba\u011flasak o da anlard\u0131, kod \u00f6yle sanatsal yaz\u0131lm\u0131\u015ft\u0131. Hele de \u00a0AGE_TO_BE_RETIRED ile WORKER_CLASS_A&#8217;n\u0131n ayn\u0131 de\u011fere sahip olup ba\u015fka mevzular\u0131 anlatt\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcnce, g\u00f6z\u00fcm\u00fcn \u00f6n\u00fcnden nef-i \u00fcstad\u0131n \u015fiirleri ge\u00e7ti. Kafiye misali iki \u015fey ayn\u0131 veriyle ifade edilmi\u015f ama bamba\u015fka bilgileri ta\u015f\u0131yordu. Derin bi nefes ald\u0131m\u00a0ve i\u00e7inden\u00a0dedim ki day\u0131 helal olsun.<\/p>\n<p><strong>Fonksiyonel Ama\u00e7l\u0131 Kullan\u0131m<\/strong><\/p>\n<p>Malumunuz fonksiyon, \u00e7ok g\u00fczel ama pahal\u0131 bir olay. Bir fonksiyon tan\u0131mlay\u0131nca yok stack idi yok parametrelerin kopyalanmas\u0131 idi yok v tablosuydu \u00e7ok masraf oluyor. Dertlendim bir g\u00fcn, gittim day\u0131ya. Day\u0131 dedim enflasyon olmu\u015f bilmem ka\u00e7? Bu fonksiyon \u00e7ok pahal\u0131 dedim. Hep kambur sand\u0131\u011f\u0131m omurgas\u0131n\u0131 do\u011frulttu ve uzaklara bakarak dedi ki: &#8220;do\u011frudur ye\u011fen, ama her derdin bir ilac\u0131 var&#8221;. Nedir dedim day\u0131, derdime derman. Gel beri bre \u00e7oban dedi, gel.<\/p>\n<p>\u00d6nce dedi, yol yordam. #define var dedi bizim, ama fonksiyon yerine kullanacaksan, hor kullanmayacaks\u0131n, ne yapt\u0131\u011f\u0131n\u0131 bileceksin dedi. Nas\u0131l yani dedim? \u00d6nce dedi k\u00f6t\u00fcs\u00fcn\u00fc g\u00f6stereyim.<\/p>\n<p><em>K\u00f6t\u00fc \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true\">define FUNC(X) f(x) ; g(x)\nif (isAllowedToRun)\nFUNC(param) ;\nelse\nexit() ;<\/pre>\n<p>Dedim day\u0131 bu kod bizim blogda vard\u0131. Ye\u011fen dedi, hakikat hep g\u00f6z\u00fcm\u00fcz\u00fcn \u00f6n\u00fcnde de\u011fil midir? Tamam dedim day\u0131 dinliyorum. Bak bu kod dedi, \u015funa \u00e7evrilir.<\/p>\n<pre class=\"lang:c decode:true \">if (isAllowedToRun)\nf(param) ; g(param) ;\nelse\nexit() ;<\/pre>\n<p>Bu da dedi, kemdir, hi\u00e7 bir derleyici bunu kabul etmez. El-aleme rezil r\u00fcsva olmak var. Ama bunun da bir \u00e7\u00f6z\u00fcm\u00fc var, dedi. Dedim day\u0131c\u0131m bak yazm\u0131\u015ft\u0131k bunu, dur dedi. Tamam dedim.<\/p>\n<p><em>\u0130yi \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true \">#define FUNC(X) do{f(x) ; g(x) ; } while(0)\nif (isAllowedToRun)\n{\nFUNC(param) ;\n}else\n{\nexit() ;\n}<\/pre>\n<p>Bak dedi, bunu b\u00f6yle yazarsan her t\u00fcrl\u00fc \u00e7al\u0131\u015f\u0131r. Su gibi, \u00e7i\u00e7ek gibi olur. Mis kokularla akar gider dedi. Dedim day\u0131c\u0131m&#8230; Biliyorum dedi, ama bir kez daha hat\u0131rlatmakta say\u0131s\u0131z feyizler var dedi.<\/p>\n<p>Dedim day\u0131c\u0131m yeni numaralar var m\u0131? Var dedi, beni takip et. Neyse bir al\u0131\u015fveri\u015f merkezine girdik. Dedi burada sana get-set kullan\u0131m\u0131 ile ilgili \u00f6nemli bir ilim aktaraca\u011f\u0131m. Bak dedi #define&#8217;\u0131n get ama\u00e7l\u0131 kullan\u0131m\u0131 \u00e7ok tehlikelidir. Sen hatalar\u0131 ba\u015ftan \u00f6nlemezsen, hatalar gelir seni bulur. Misal dedi:<\/p>\n<p><em>S\u0131k\u0131nt\u0131l\u0131 \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true\">typedef struct\n{\nfloat_t temperature;\ntime_t time;\nuint32_t index;\n}ts_MachineVariables;\nts_MachineVariables SMachine;\n#define GET_MACHINE_TEMPERATURE(MACHINE) (MACHINE.temperature)\nvoid Foo(void)\n{\nGET_MACHINE_TEMPERATURE(SMachine) = 25. 0;\n\/\/or\nif(GET_MACHINE_TEMPERATURE(SMachine) = 25. 0)\n}<\/pre>\n<p>Bak ye\u011fen dedi day\u0131. Y\u0131kar\u0131daki GET makrosunu sen yazm\u0131\u015ft\u0131n ama d\u0131\u015f g\u00fc\u00e7ler, senin yazd\u0131\u011f\u0131n makroyu a\u015fa\u011f\u0131daki gibi haince kullanarak, makinemizin s\u0131cakl\u0131\u011f\u0131 ile oynad\u0131lar. Makinelerin garantisinin bitti\u011fi g\u00fcn hepsini yakt\u0131lar. Oldu mu dedi \u015fimdi?<\/p>\n<p>Dedim day\u0131 ne diyorsun? \u015eaka \u015faka dedi, ama dedi bak \u00f6nlemini \u015f\u00f6yle al.<\/p>\n<p><em>S\u0131k\u0131nt\u0131s\u0131z \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true\">typedef struct\n{\nfloat_t temperature;\ntime_t time;\nuint32_t index;\n}ts_MachineVariables;\nts_MachineVariables SMachine;\n#define GET_MACHINE_TEMPERATURE(MACHINE) ((const float_t)MACHINE.temperature)\nvoid Foo(void)\n{\n\/\/denedi ama hata ald\u0131 cunku sabite deger atanmaz\nGET_MACHINE_TEMPERATURE(SMachine) = 25. 0;\n\/\/denedi ama hata ald\u0131. nededini biliyorsunuz\nif(GET_MACHINE_TEMPERATURE(SMachine) = 25. 0) \n\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Koda bakt\u0131m, dedim ne \u00e7akall\u0131k, pes do\u011frusu. Day\u0131, de\u011fi\u015fkeni get ederken ba\u015f\u0131na kodu\u011fu const ile, de\u011fi\u015fkeni read only yani sadece okunur yapm\u0131\u015ft\u0131. Day\u0131 dedim bu da bana ders olsun, senden korkulur. Ne sand\u0131n ye\u011fen dedi.<\/p>\n<p><strong>Karakter Sava\u015flar\u0131<\/strong><\/p>\n<p>Neyse \u00e7\u0131k\u0131\u015fta day\u0131 tutturdu tarih anlat\u0131cam diye. Ne tarihi? Sava\u015f tarihi. Kimin sava\u015f\u0131? Karakterlerin. Haydi hay\u0131rl\u0131s\u0131 dedim. Day\u0131 dedi ki, derleyici de sonu\u00e7ta insan i\u015fi. \u0130radesi k\u00fcll-i. \u00c7ok kar\u0131\u015ft\u0131r\u0131rsan kafas\u0131n\u0131 hata yapar dedi.\u00a0Ben kahkahay\u0131 patlat\u0131nca, a\u00e7t\u0131 kodu pat diye.<\/p>\n<p><em>K\u00f6t\u00fc \u00d6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true \">#define LOOKUP(c) (a[ ' c' +(c) ] ) \/* Sometimes breaks. *\/<\/pre>\n<p>Bak dedi ye\u011fen, bu makroda hangi c, makrodan al\u0131nacak belli olmad\u0131\u011f\u0131ndan, her derleyici buna ayn\u0131 cevab\u0131 vermez. Kafas\u0131 kar\u0131\u015f\u0131r biri c karakteriyle girdi\u011fin say\u0131y\u0131 toplar biri ba\u015fka i\u015f yapar dedi. G\u00f6zlerimi falta\u015f\u0131 gibi a\u00e7\u0131p, ibreti download etmeye ba\u015flad\u0131m. Download i\u015fi biter bitmez day\u0131 bir de bu kodu incele dedi.<\/p>\n<p><em>\u0130yi \u00f6rnek:<\/em><\/p>\n<pre class=\"lang:c decode:true \">#define LOOKUP(chr) (a[ ' c' +(chr) ] ) \/* Works as intended. *\/<\/pre>\n<p>Bak dedi ye\u011fen, bu tan\u0131mda karakter sava\u015flar\u0131 olmaz. Herkesin yeri belli, burada sulh tahsis edilmi\u015f olur dedi. Bu ibreti de download ederek olay yerinden usulca uzakla\u015ft\u0131m.<\/p>\n<p>Day\u0131yla o g\u00fcnl\u00fck muhabbetimiz burada tamamland\u0131. Hepinize selam\u0131 var \ud83d\ude42<\/p>\n<p>Unutmadan; yaz\u0131lar\u0131 be\u011fendiyseniz e\u011fer, \u00a0faydalanabilecek arkada\u015flar\u0131n\u0131zla da payla\u015fabilirseniz sevinirim.<\/p>\n<p>\u015eimdi devam&#8230;<\/p>\n<a href=\"http:\/\/ozenozkaya.com\/blog\/?p=263\" class=\"su-button su-button-style-3d\" style=\"color:#FFFFFF;background-color:#2D89EF;border-color:#246ec0;border-radius:5px\" target=\"_self\"><span style=\"color:#FFFFFF;padding:6px 16px;font-size:13px;line-height:20px;border-color:#6cadf4;border-radius:5px;text-shadow:none\"><i class=\"sui sui-arrow-circle-o-left\" style=\"font-size:13px;color:#FFFFFF\"><\/i> \u00d6nceki Sayfa<\/span><\/a> \u00a0<a href=\"http:\/\/ozenozkaya.com\/blog\/?p=282\" class=\"su-button su-button-style-3d\" style=\"color:#FFFFFF;background-color:#2D89EF;border-color:#246ec0;border-radius:5px\" target=\"_self\"><span style=\"color:#FFFFFF;padding:6px 16px;font-size:13px;line-height:20px;border-color:#6cadf4;border-radius:5px;text-shadow:none\"><i class=\"sui sui-arrow-circle-right\" style=\"font-size:13px;color:#FFFFFF\"><\/i> Sonraki Sayfa<\/span><\/a>\n","protected":false},"excerpt":{"rendered":"<p>Bu g\u00fcnk\u00fc yaz\u0131mda, di\u011fer yaz\u0131larda da ucundan kula\u011f\u0131nda bir miktar bahsetmi\u015f oldu\u011fum #define ile tan\u0131mlanan etiketler \u00fczerinde duraca\u011f\u0131m. Her durumda etiketleme yapmak\u00a0do\u011fru olmayabilir, ancak C dilinde etiketler \u00e7ok \u00a0\u00f6nemlidir. Bu sebeple, \u00e7i\u00e7ek gibi kodlama yapmak i\u00e7in bu m\u00fcstesna \u00f6zelli\u011fi ne \u015fekilde kullanmak laz\u0131m ona de\u011finece\u011fim. Bunlar\u0131 ifade ederken, day\u0131yla olan an\u0131lar\u0131m\u0131zdan dem vuraca\u011f\u0131m. Yani bu <a class=\"read-more\" href=\"http:\/\/ozenozkaya.com\/blog\/?p=275\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_tr_post_content":"Bu g\u00fcnk\u00fc yaz\u0131mda, di\u011fer yaz\u0131larda da ucundan kula\u011f\u0131nda bir miktar bahsetmi\u015f oldu\u011fum #define ile tan\u0131mlanan etiketler \u00fczerinde duraca\u011f\u0131m. Her durumda etiketleme yapmak\u00a0do\u011fru olmayabilir, ancak C dilinde etiketler \u00e7ok \u00a0\u00f6nemlidir. Bu sebeple, \u00e7i\u00e7ek gibi kodlama yapmak i\u00e7in bu m\u00fcstesna \u00f6zelli\u011fi ne \u015fekilde kullanmak laz\u0131m ona de\u011finece\u011fim.\n\nBunlar\u0131 ifade ederken, day\u0131yla olan an\u0131lar\u0131m\u0131zdan dem vuraca\u011f\u0131m. Yani bu yaz\u0131n\u0131n temas\u0131 bizim day\u0131.\n\nEtiketler diye adland\u0131rd\u0131\u011f\u0131m bu #define nanesi genel olarak iki temel amaca hizmet eder efem: etiketleme amac\u0131 ve fonksiyonel ama\u00e7. Her iki amac\u0131n da alt\u0131na yatan nane ayn\u0131 define nanesi oldu\u011fun i\u00e7in, nanenin iki \u00e7e\u015fit s\u0131k\u0131lm\u0131\u015f suyu da \u00f6z\u00fcnde ayn\u0131 tad\u0131 verir. Bu tad\u0131n g\u00fczel olmas\u0131 i\u00e7in bir iki p\u00fcf noktas\u0131n\u0131 akl\u0131m\u0131zda tutmam\u0131zda say\u0131s\u0131z faideler var. \u0130\u015fbu yaz\u0131da bu p\u00fcf noktalara dem vurulacakt\u0131r.\n\n<strong>Etiketleme Amac\u0131yla Kullan\u0131m\u0131<\/strong>\n\nBu kullan\u0131m\u0131 esasen magic number coding k\u0131sm\u0131nda anlatm\u0131\u015ft\u0131m ama \u015fimdi biraz daha farkl\u0131 bir a\u00e7\u0131yla konuyu felsefi olarak irdeleyece\u011fim. #define ifadesinin etiketleme amac\u0131yla kullan\u0131lmas\u0131 esasen, verinin bilgiye d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi yani bir anlamda verinin bilgi olarak etiketlenmesidir.\n\nHat\u0131rlay\u0131n, 'A' karakteri de, emeklilik ya\u015f\u0131 da 65 say\u0131s\u0131 ile ifade ediliyordu. Yani burada iki farkl\u0131 bilgi, ayn\u0131 veriyle ifade edilebiliyordu. O zaman hangi verinin hangi bilgiyi etiketledi\u011fini bilebilmek i\u00e7in basit\u00e7e onu etiketlememiz gerekiyor :)\n\nK\u00f6t\u00fc \u00f6rnekten \u00f6rnek olmaz ama, misal diye s\u00f6ze ba\u015flayarak bir k\u00f6t\u00fc \u00f6rnekle devam edelim.\n\n<em>K\u00f6t\u00fc \u00d6rnek:<\/em>\n\n<pre class=\"lang:c decode:true \">uint8_t threshold;\nuint8_t class;\n. . .\nif(threshold &gt; 65)\n{\nclass = 65 ;\n}<\/pre>\n\n\u015eimdi bu kodu yazan day\u0131 bir nane yemi\u015f yazm\u0131\u015f, belli ki de \u00e7al\u0131\u015f\u0131yor diye sonradan da bozmam\u0131\u015f. Hadi day\u0131 bu naneyi yemi\u015f, kimse de \u00e7\u0131k\u0131p dememi\u015f ki \"Aga bu nedir?\". Ben gittim sordum, kodu yazan day\u0131n\u0131n amac\u0131, bir i\u015f\u00e7i e\u011fer 65 ya\u015f\u0131ndan b\u00fcy\u00fckse, o ilgili \u015firkette A s\u0131n\u0131f\u0131 bir \u00e7al\u0131\u015fan oluyormu\u015f. Yaz\u0131l\u0131m da \u015firket \u00e7al\u0131\u015fanlar\u0131n\u0131 bu anlamda kontrol edip etiketliyormu\u015f. Day\u0131 dedim bak bizim blogda b\u00f6yle b\u00f6yle mevzular var, bunun ad\u0131 magic number coding. Hadi biz g\u00f6rd\u00fck sineye att\u0131k, el-alem g\u00f6rse bu koda ne der? D\u00fczeltelim \u00f6yleyse dedi day\u0131, neye d\u00fczeltti\u011fini siz biliyorsunuz :).\n\n<em>\u0130yi \u00d6rnek:<\/em>\n\n<pre class=\"lang:c decode:true \">#define AGE_TO_BE_RETIRED (65)\n#define AGE_TO_DRIVE_CAR (18)\n. . .\n#define WORKER_CLASS_A (' A' )\n#define WORKER_CLASS_B (' B' )\n#define WORKER_CLASS_C (' C' )\n#define WORKER_CLASS_D (' D' )\nuint8_t ageThresholdToBeRetired;\nuint8_t classOfTheWorker;\nif(threshold &gt; AGE_TO_BE_RETIRED )\n{\nclass = WORKER_CLASS_A;\n}<\/pre>\n\nNeyse \u00e7\u0131kt\u0131m sonra day\u0131n\u0131n yan\u0131ndan, y\u00fcr\u00fcyorum. Bi bakt\u0131m arkadan biri \"hooooop\" diye ba\u011f\u0131r\u0131yor. D\u00f6nd\u00fcm bir bakt\u0131m yine bizim day\u0131. Day\u0131 bir disketi elime tutu\u015fturdu. Al dedi ye\u011fen, laz\u0131m olur. Neyse g\u00fc\u00e7 bela disket okuyuculu bir bilgisayar buldum ve i\u00e7indeki .c uzant\u0131l\u0131 dosyay\u0131 g\u00f6rd\u00fcm. Heyecanla dosyay\u0131 a\u00e7t\u0131\u011f\u0131mda, olan biteni hemen anlad\u0131m. \u00c7\u00fcnk\u00fc day\u0131 kodu d\u00fczeltmi\u015f, alemlere ibret olsun diye diske koymu\u015f. Yaz\u0131l\u0131m\u0131 okurken sanki \u015fiir okur gibi, her bir \u015feyi anlad\u0131m. E\u015f\u015fe\u011fi ba\u011flasak o da anlard\u0131, kod \u00f6yle sanatsal yaz\u0131lm\u0131\u015ft\u0131. Hele de \u00a0AGE_TO_BE_RETIRED ile WORKER_CLASS_A'n\u0131n ayn\u0131 de\u011fere sahip olup ba\u015fka mevzular\u0131 anlatt\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcnce, g\u00f6z\u00fcm\u00fcn \u00f6n\u00fcnden nef-i \u00fcstad\u0131n \u015fiirleri ge\u00e7ti. Kafiye misali iki \u015fey ayn\u0131 veriyle ifade edilmi\u015f ama bamba\u015fka bilgileri ta\u015f\u0131yordu. Derin bi nefes ald\u0131m\u00a0ve i\u00e7inden\u00a0dedim ki day\u0131 helal olsun.\n\n<strong>Fonksiyonel Ama\u00e7l\u0131 Kullan\u0131m<\/strong>\n\nMalumunuz fonksiyon, \u00e7ok g\u00fczel ama pahal\u0131 bir olay. Bir fonksiyon tan\u0131mlay\u0131nca yok stack idi yok parametrelerin kopyalanmas\u0131 idi yok v tablosuydu \u00e7ok masraf oluyor. Dertlendim bir g\u00fcn, gittim day\u0131ya. Day\u0131 dedim enflasyon olmu\u015f bilmem ka\u00e7? Bu fonksiyon \u00e7ok pahal\u0131 dedim. Hep kambur sand\u0131\u011f\u0131m omurgas\u0131n\u0131 do\u011frulttu ve uzaklara bakarak dedi ki: \"do\u011frudur ye\u011fen, ama her derdin bir ilac\u0131 var\". Nedir dedim day\u0131, derdime derman. Gel beri bre \u00e7oban dedi, gel.\n\n\u00d6nce dedi, yol yordam. #define var dedi bizim, ama fonksiyon yerine kullanacaksan, hor kullanmayacaks\u0131n, ne yapt\u0131\u011f\u0131n\u0131 bileceksin dedi. Nas\u0131l yani dedim? \u00d6nce dedi k\u00f6t\u00fcs\u00fcn\u00fc g\u00f6stereyim.\n\n<em>K\u00f6t\u00fc \u00d6rnek:<\/em>\n\n<pre class=\"lang:c decode:true\">define FUNC(X) f(x) ; g(x)\nif (isAllowedToRun)\nFUNC(param) ;\nelse\nexit() ;<\/pre>\n\nDedim day\u0131 bu kod bizim blogda vard\u0131. Ye\u011fen dedi, hakikat hep g\u00f6z\u00fcm\u00fcz\u00fcn \u00f6n\u00fcnde de\u011fil midir? Tamam dedim day\u0131 dinliyorum. Bak bu kod dedi, \u015funa \u00e7evrilir.\n\n<pre class=\"lang:c decode:true \">if (isAllowedToRun)\nf(param) ; g(param) ;\nelse\nexit() ;<\/pre>\n\nBu da dedi, kemdir, hi\u00e7 bir derleyici bunu kabul etmez. El-aleme rezil r\u00fcsva olmak var. Ama bunun da bir \u00e7\u00f6z\u00fcm\u00fc var, dedi. Dedim day\u0131c\u0131m bak yazm\u0131\u015ft\u0131k bunu, dur dedi. Tamam dedim.\n\n<em>\u0130yi \u00d6rnek:<\/em>\n\n<pre class=\"lang:c decode:true \">#define FUNC(X) do{f(x) ; g(x) ; } while(0)\nif (isAllowedToRun)\n{\nFUNC(param) ;\n}else\n{\nexit() ;\n}<\/pre>\n\nBak dedi, bunu b\u00f6yle yazarsan her t\u00fcrl\u00fc \u00e7al\u0131\u015f\u0131r. Su gibi, \u00e7i\u00e7ek gibi olur. Mis kokularla akar gider dedi. Dedim day\u0131c\u0131m... Biliyorum dedi, ama bir kez daha hat\u0131rlatmakta say\u0131s\u0131z feyizler var dedi.\n\nDedim day\u0131c\u0131m yeni numaralar var m\u0131? Var dedi, beni takip et. Neyse bir al\u0131\u015fveri\u015f merkezine girdik. Dedi burada sana get-set kullan\u0131m\u0131 ile ilgili \u00f6nemli bir ilim aktaraca\u011f\u0131m. Bak dedi #define'\u0131n get ama\u00e7l\u0131 kullan\u0131m\u0131 \u00e7ok tehlikelidir. Sen hatalar\u0131 ba\u015ftan \u00f6nlemezsen, hatalar gelir seni bulur. Misal dedi:\n\n<em>S\u0131k\u0131nt\u0131l\u0131 \u00d6rnek:<\/em>\n\n<pre class=\"lang:c decode:true\">typedef struct\n{\nfloat_t temperature;\ntime_t time;\nuint32_t index;\n}ts_MachineVariables;\nts_MachineVariables SMachine;\n#define GET_MACHINE_TEMPERATURE(MACHINE) (MACHINE.temperature)\nvoid Foo(void)\n{\nGET_MACHINE_TEMPERATURE(SMachine) = 25. 0;\n\/\/or\nif(GET_MACHINE_TEMPERATURE(SMachine) = 25. 0)\n}<\/pre>\n\nBak ye\u011fen dedi day\u0131. Y\u0131kar\u0131daki GET makrosunu sen yazm\u0131\u015ft\u0131n ama d\u0131\u015f g\u00fc\u00e7ler, senin yazd\u0131\u011f\u0131n makroyu a\u015fa\u011f\u0131daki gibi haince kullanarak, makinemizin s\u0131cakl\u0131\u011f\u0131 ile oynad\u0131lar. Makinelerin garantisinin bitti\u011fi g\u00fcn hepsini yakt\u0131lar. Oldu mu dedi \u015fimdi?\n\nDedim day\u0131 ne diyorsun? \u015eaka \u015faka dedi, ama dedi bak \u00f6nlemini \u015f\u00f6yle al.\n\n<em>S\u0131k\u0131nt\u0131s\u0131z \u00d6rnek:<\/em>\n\n<pre class=\"lang:c decode:true\">typedef struct\n{\nfloat_t temperature;\ntime_t time;\nuint32_t index;\n}ts_MachineVariables;\nts_MachineVariables SMachine;\n#define GET_MACHINE_TEMPERATURE(MACHINE) ((const float_t)MACHINE.temperature)\nvoid Foo(void)\n{\n\/\/denedi ama hata ald\u0131 cunku sabite deger atanmaz\nGET_MACHINE_TEMPERATURE(SMachine) = 25. 0;\n\/\/denedi ama hata ald\u0131. nededini biliyorsunuz\nif(GET_MACHINE_TEMPERATURE(SMachine) = 25. 0) \n\n}<\/pre>\n\n&nbsp;\n\nKoda bakt\u0131m, dedim ne \u00e7akall\u0131k, pes do\u011frusu. Day\u0131, de\u011fi\u015fkeni get ederken ba\u015f\u0131na kodu\u011fu const ile, de\u011fi\u015fkeni read only yani sadece okunur yapm\u0131\u015ft\u0131. Day\u0131 dedim bu da bana ders olsun, senden korkulur. Ne sand\u0131n ye\u011fen dedi.\n\n<strong>Karakter Sava\u015flar\u0131<\/strong>\n\nNeyse \u00e7\u0131k\u0131\u015fta day\u0131 tutturdu tarih anlat\u0131cam diye. Ne tarihi? Sava\u015f tarihi. Kimin sava\u015f\u0131? Karakterlerin. Haydi hay\u0131rl\u0131s\u0131 dedim. Day\u0131 dedi ki, derleyici de sonu\u00e7ta insan i\u015fi. \u0130radesi k\u00fcll-i. \u00c7ok kar\u0131\u015ft\u0131r\u0131rsan kafas\u0131n\u0131 hata yapar dedi.\u00a0Ben kahkahay\u0131 patlat\u0131nca, a\u00e7t\u0131 kodu pat diye.\n\n<em>K\u00f6t\u00fc \u00d6rnek:<\/em>\n\n<pre class=\"lang:c decode:true \">#define LOOKUP(c) (a[ ' c' +(c) ] ) \/* Sometimes breaks. *\/<\/pre>\n\nBak dedi ye\u011fen, bu makroda hangi c, makrodan al\u0131nacak belli olmad\u0131\u011f\u0131ndan, her derleyici buna ayn\u0131 cevab\u0131 vermez. Kafas\u0131 kar\u0131\u015f\u0131r biri c karakteriyle girdi\u011fin say\u0131y\u0131 toplar biri ba\u015fka i\u015f yapar dedi. G\u00f6zlerimi falta\u015f\u0131 gibi a\u00e7\u0131p, ibreti download etmeye ba\u015flad\u0131m. Download i\u015fi biter bitmez day\u0131 bir de bu kodu incele dedi.\n\n<em>\u0130yi \u00f6rnek:<\/em>\n\n<pre class=\"lang:c decode:true \">#define LOOKUP(chr) (a[ ' c' +(chr) ] ) \/* Works as intended. *\/<\/pre>\n\nBak dedi ye\u011fen, bu tan\u0131mda karakter sava\u015flar\u0131 olmaz. Herkesin yeri belli, burada sulh tahsis edilmi\u015f olur dedi. Bu ibreti de download ederek olay yerinden usulca uzakla\u015ft\u0131m.\n\nDay\u0131yla o g\u00fcnl\u00fck muhabbetimiz burada tamamland\u0131. Hepinize selam\u0131 var :)\n\nUnutmadan; yaz\u0131lar\u0131 be\u011fendiyseniz e\u011fer, \u00a0faydalanabilecek arkada\u015flar\u0131n\u0131zla da payla\u015fabilirseniz sevinirim.\n\n\u015eimdi devam...\n\n[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=263\" style=\"3d\"\u00a0icon=\"icon: arrow-circle-o-left\"]\u00d6nceki Sayfa[\/su_button] \u00a0[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=282\" style=\"3d\" icon=\"icon: arrow-circle-right\"]Sonraki Sayfa[\/su_button]","_tr_post_name":"gomulu-sistemler-21-etiketler-ve-makrolar","_tr_post_excerpt":"","_tr_post_title":"G\u00f6m\u00fcl\u00fc C - 10 : G\u00f6m\u00fcl\u00fc C: Etiketler ve Makrolar","_en_post_content":"","_en_post_name":"","_en_post_excerpt":"","_en_post_title":"","edit_language":"tr","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2}},"categories":[2,3],"tags":[],"class_list":["post-275","post","type-post","status-publish","format-standard","hentry","category-elektronik","category-gomulu-sistemler"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5gWM6-4r","jetpack-related-posts":[],"_links":{"self":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/275","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=275"}],"version-history":[{"count":0,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/275\/revisions"}],"wp:attachment":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=275"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=275"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=275"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}