{"id":1313,"date":"2019-07-29T21:24:15","date_gmt":"2019-07-29T21:24:15","guid":{"rendered":"http:\/\/www.yazilimperver.com\/?p=1313"},"modified":"2019-07-29T21:24:15","modified_gmt":"2019-07-29T21:24:15","slug":"haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/","title":{"rendered":"Haftal\u0131k C++ 17 \u2013 Sat\u0131r aras\u0131 de\u011fi\u015fkenler kod par\u00e7as\u0131 ve tek tan\u0131m kural\u0131"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Evet arkada\u015flar, QT\u2019ye ili\u015fkin biraz ayd\u0131nland\u0131ktan sonra, haftal\u0131k C++ yaz\u0131lar\u0131m\u0131za, k\u0131sa bir kod par\u00e7as\u0131 yaz\u0131s\u0131 ile devam edelim (damarlara C++ zerk etmeye devam :). Bu yaz\u0131mda C++ 17 ile birlikte gelen Sat\u0131r Aras\u0131 De\u011fi\u015fkenleri (\u201c<strong><em>inline variables<\/em><\/strong>\u201d) kabiliyetinden bahsedece\u011fim. Bu kabiliyetin de kodunuzu daha okunakl\u0131 ve temiz hale getirece\u011fini d\u00fc\u015f\u00fcn\u00fcyorum a\u00e7\u0131k\u00e7as\u0131. Ayr\u0131ca sadece ba\u015fl\u0131k dosyalar\u0131ndan olu\u015fan k\u00fct\u00fcphane geli\u015ftiricileri de bu kabiliyeti \u00e7ok sevecekler. Kabiliyete ili\u015fkin \u00f6neriye kaynaklardan ula\u015fabilirsiniz.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Daha \u00f6nceki yeni kabiliyet yaz\u0131lar\u0131mda oldu\u011fu gibi, yine \u00f6nce nas\u0131ld\u0131, art\u0131k nas\u0131l oldu\u011funu sizler ile payla\u015faca\u011f\u0131m.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Normalde (C++ 17 \u00f6ncesinde), a\u015fa\u011f\u0131daki kodu yazd\u0131\u011f\u0131n\u0131z zaman derleme hatas\u0131 al\u0131rd\u0131n\u0131z. \u00c7\u00fcnk\u00fc C++, <em>statik<\/em> olmayan ve <em>const<\/em> olmayan de\u011fi\u015fkenlerin bu \u015fekilde tan\u0131mlanmas\u0131na izin vermiyordu.<\/span><\/p>\n<pre class=\"lang:c++ decode:true\">class MyClass\r\n{\r\nprivate:\r\n    static int mIntMember = 10;\r\n    static std::string mStrMember = \"\";\r\n};<\/pre>\n<p><span style=\"font-weight: 400;\">Peki bu durumda ne yap\u0131yorduk. A\u015fa\u011f\u0131daki gibi mi yap\u0131yorduk?<\/span><\/p>\n<pre class=\"lang:c++ decode:true \">class MyClass\r\n{\r\nprivate:\r\n    static int mIntMember = 10;\r\n    static std::string mStrMember = \"\";\r\n};\r\nMyClass::mIntMember = 10;\r\nMyClass::mStrMember = \"\";\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">Dikkatli okuyucular\u0131m, bu \u015fekilde tan\u0131mlan\u0131p, birden fazla dosyada bu ba\u015fl\u0131k dosyas\u0131 eklendi\u011finde, ba\u011flama hatas\u0131 alaca\u011f\u0131m\u0131z\u0131 hemen fark ederler. Neden? \u00c7\u00fcnk\u00fc her bir dosya bu tan\u0131mlamalar\u0131 tekrar tekrar yap\u0131yor. Tek tan\u0131mlama kural\u0131 ihlal ediliyor (bu kurala yaz\u0131m\u0131n sonunda tekrar de\u011finece\u011fim). Ayn\u0131 \u015fey asl\u0131nda bu seviyede yap\u0131lan global de\u011fi\u015fken tan\u0131mlar\u0131 i\u00e7in de ge\u00e7erli, bir di\u011fer ifade ile, ba\u015fl\u0131k dosyalar\u0131nda tan\u0131mlad\u0131\u011f\u0131n\u0131z de\u011fi\u015fkenler, b\u00fct\u00fcn eklenen dosyalar i\u00e7in kopyalan\u0131yor, k\u00fc\u00e7\u00fck sabitler i\u00e7in s\u0131k\u0131nt\u0131 olmayabilir ama b\u00fcy\u00fck s\u0131n\u0131flarda nas\u0131l bir s\u0131k\u0131nt\u0131 olaca\u011f\u0131n\u0131 eminim tahmin edersiniz ama o noktaya da gelece\u011fiz, \u015fu an konumuz o de\u011fil.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Bu s\u0131k\u0131nt\u0131y\u0131 gidermek i\u00e7in ya ilgili de\u011fi\u015fkeni a\u015fa\u011f\u0131daki gibi \u201c<em>static const<\/em>\u201d olarak tan\u0131mlayabiliriz:<\/span><\/p>\n<pre class=\"lang:c++ decode:true \">class MyClass\r\n{\r\nprivate:\r\n    static const int mIntMember = 10;\r\n    static const std::string mStrMember = \"\";\r\n};<\/pre>\n<p><span style=\"font-weight: 400;\">Ya da ilgili de\u011fi\u015fkenleri herhangi bir Cpp dosyas\u0131 i\u00e7erisinde a\u015fa\u011f\u0131daki gibi tan\u0131mlaman\u0131z gerekmekteydi:<\/span><\/p>\n<pre class=\"lang:c++ decode:true \">int ExampleClass::mIntMember;\r\nstd::string ExampleClass::mStrMember;<\/pre>\n<p><span style=\"font-weight: 400;\">Bu durumda e\u011fer tek ba\u015fl\u0131k dosyal\u0131 bir k\u00fct\u00fcphaneniz oldu\u011funu d\u00fc\u015f\u00fcn\u00fcn, bu de\u011fi\u015fkeni nereye koyacaks\u0131n\u0131z? Tek bir ba\u015fl\u0131k dosyas\u0131 olmasa bile bunun konumland\u0131r\u0131lmas\u0131, a\u00e7\u0131k\u00e7as\u0131 hem okunabilirli\u011fi hem de idameyi zorla\u015ft\u0131r\u0131yor.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">C++ 17 ile birlikte gelen \u201c<em>inline variable<\/em>\u201d kabiliyeti ile birlikte art\u0131k yukar\u0131daki statik \u00fcye de\u011fi\u015fkenleri a\u015fa\u011f\u0131daki gibi ilklendirebilirsiniz. <\/span><\/p>\n<pre class=\"lang:c++ decode:true\">class MyClass\r\n{\r\nprivate:\r\n    static inline int mIntMember = 10;\r\n    static inline std::string mStrMember = \"\";\r\n};<\/pre>\n<p><span style=\"font-weight: 400;\">Ta ta!\u00a0 Hat\u0131rlayaca\u011f\u0131n\u0131z \u00fczere C++ 11 de statik olmayan s\u0131n\u0131f de\u011fi\u015fkenleri i\u00e7in bu tarz ilklendirmeler yapabiliyorduk.\u00a0Ayr\u0131ca C++ 17 ile birlikte <em>constexpr<\/em> da <em>inline<\/em> olarak kabul ediliyor. Yani a\u015fa\u011f\u0131daki ifade C++ 17 ile birlikte art\u0131k bir tan\u0131mlama olarak kabul ediliyor, yukar\u0131daki \u00f6rnek ile ayn\u0131 (deklarasyon de\u011fil, \u00e7\u00fcnk\u00fc C++ 11 ve C++ 14 de bu kullan\u0131m halen ge\u00e7erli idi ama tan\u0131mlama anlam\u0131na gelmiyordu):<\/span><\/p>\n<pre class=\"lang:c++ decode:true \">class MyClass\r\n{\r\nprivate:\r\n    static contexpr int mIntMember = 10;\r\n    static contexpr std::string mStrMember = \u201c\u201d;\r\n};<\/pre>\n<p><span style=\"font-weight: 400;\">Akl\u0131n\u0131za eminim bunlar\u0131n ne zaman ilklendirildi\u011fi sorusu da gelmi\u015ftir (gelmemi\u015f ise de \u00f6nemli bir mevzu). Bu kullan\u0131mlarda ilklendirme, ilk kullan\u0131m kar\u015f\u0131la\u015f\u0131ld\u0131\u011f\u0131nda ger\u00e7ekle\u015ftirilmekte.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Buraya kadar anlatt\u0131\u011f\u0131m statik \u00fcye de\u011fi\u015fkenlerin ilklendirilmesinin yan\u0131nda, &#8220;<em>inline variables<\/em>\u201d ile birlikte, art\u0131k ba\u015fl\u0131k dosyalar\u0131nda tan\u0131mlanan global de\u011fi\u015fkenler de <em>inline<\/em> olarak tan\u0131mlanabilecek. Bu sayede birden fazla nesne olu\u015fturulmas\u0131n\u0131n da \u00f6n\u00fcne ge\u00e7ebileceksiniz (C++ 17 den \u00f6nce, yukar\u0131da da bahsetti\u011fim \u00fczere ba\u011flama hatas\u0131 al\u0131yorduk). Ba\u015fka neyin \u00f6n\u00fcne ge\u00e7ece\u011fiz? Asl\u0131nda bo\u015fu bo\u015funa daha fazla bellek t\u00fcketmenin ve bir \u00e7ok kez yap\u0131c\u0131 (ve sonda y\u0131k\u0131c\u0131) \u00e7a\u011fr\u0131lmas\u0131n\u0131n \u00f6n\u00fcne ge\u00e7ece\u011fiz (yukar\u0131daki b\u00fcy\u00fck nesnelerin global olarak tan\u0131mlanmas\u0131 mevzusu). Hemen bir \u00f6rnek ile bu kullan\u0131m\u0131 da ta\u00e7land\u0131ral\u0131m. Bu arada her ne kadar baz\u0131 derleyiciler C++ 17 deste\u011fi sunsalar da, bu kabiliyet bekledi\u011fimiz gibi \u00e7al\u0131\u015fm\u0131yor olabilir. Mesela VS 2017&#8242;, her ne kadar bu kullan\u0131mlar ge\u00e7erli olarak kabul edilse de, ne yaz\u0131k ki, beklenen davran\u0131\u015f sergilenmiyor, o sebeple l\u00fctfen dikkat.<\/span><\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n\r\n\/\/ Bu baslik dosyasinin birden fazla kaynak dosyasi tarafindan dahil edildigini dusunu\r\nclass ExampleClass\r\n{\r\npublic:\r\n\t\r\n\tExampleClass()\r\n\t{\r\n\t\tstd::cout &lt;&lt; \"ExampleClass is instantiated!\" &lt;&lt; '\\n';\r\n\t}\r\n};\r\n\r\n\/\/ Baglama hatas\u0131. Birden fazla tan\u0131ml\u0131!\r\nExampleClass gGlobalInstance;\r\n\r\n\/\/ C++ 17 ile birlikte, birden fazla dosya taraf\u0131ndan bu ba\u015fl\u0131k dosyasi eklense bile s\u0131k\u0131nt\u0131 yok\r\n\/\/ K\u00fc\u00e7\u00fck bir not: Visual Studio 2017 15.9.14\u2019de halen farkl\u0131 nesneler olu\u015fturuluyor (yani yukar\u0131daki metni iki kere g\u00f6rmeniz muhtemel)\r\n\/\/ ama VS 2019 16.2\u2019de olmas\u0131 gerekti\u011fi gibi tek nesne olu\u015fturulmakta.\r\ninline ExampleClass gGlobalInstance;\r\n<\/pre>\n<p><span style=\"font-weight: 400;\"><em>inline<\/em> anahtar kelimesi ayr\u0131ca \u201c<em>thread_local<\/em>\u201d ile de kullan\u0131labiliyor. Bu sayede her bir thread i\u00e7in e\u015fsiz bir de\u011fi\u015fken olu\u015fturabiliyorsunuz. A\u015fa\u011f\u0131da tan\u0131mlanan de\u011fi\u015fkenlerin, davran\u0131\u015flar\u0131n\u0131 farkl\u0131 tan\u0131mlamalar ile g\u00f6rebilirsiniz:<\/span><\/p>\n<pre class=\"lang:c++ decode:true \">struct ThreadData \r\n{\r\n\/\/ Program i\u00e7erisinde e\u015fsiz ama her thread i\u00e7erisinde ayn\u0131\r\ninline static std::string mAppName = \u201cglobal app name\u201d;\r\n\r\n\/\/ Her bir thread i\u00e7erisinde e\u015fsiz\r\ninline static thread_local std::string mThreadName = \u201cthead 1\u201d; \r\n\r\n\/\/ Her bir ExampleThreadData nesnesinde ge\u00e7erli\r\nstd::string mLocalName = \u201dpoor object\u201d;\r\n...\r\n};<\/pre>\n<p>Evet &#8220;inline variables&#8221;&#8216;\u0131n temel i\u015flevlerine bakt\u0131ktan sonra, \u015fimdi bu konu ile ilintili ba\u015fka bir konuya da k\u0131saca de\u011finip yaz\u0131m\u0131 sonland\u0131raca\u011f\u0131m. Yaz\u0131m\u0131n ba\u015f\u0131nda da bahsetti\u011fim ba\u011flama s\u0131k\u0131nt\u0131s\u0131n\u0131n neden oldu\u011funu veya bunun neye dayand\u0131\u011f\u0131n\u0131 bilmek istersiniz diye d\u00fc\u015f\u00fcn\u00fcyorum.<\/p>\n<p>Bunun dayand\u0131\u011f\u0131 kural ise Tek Tan\u0131m Kural\u0131&#8217;d\u0131r (<em>&#8220;One Definition Rule&#8221;<\/em>). Bu kural C++ 2003 standard\u0131nda tan\u0131mlanm\u0131\u015ft\u0131r ve bunun ihlali sonucu bu tarz hatalar al\u0131rs\u0131n\u0131z. Temelde bu kural\u0131n s\u00f6yledi\u011fi \u015fey metot ya da s\u0131n\u0131f\u0131n ayn\u0131 dosya ya da program i\u00e7erisinde birden fazla tan\u0131m\u0131 olmayaca\u011f\u0131d\u0131r (bulundu\u011fu kapsama g\u00f6re, bu durum de\u011fi\u015fkenler, s\u0131n\u0131flar, yap\u0131lar (<em>struct<\/em>), fonksiyonlar i\u00e7in de ge\u00e7erlidir). Zaten \u00e7o\u011fu derleyici de bu durum kar\u015f\u0131s\u0131nda, bu de\u011fi\u015fkenin birden fazla tan\u0131mland\u0131\u011f\u0131na dair size uyar\u0131 verecektir. Tabi \u015funu hat\u0131rlatmakta fayda var ki, C++ da deklarasyonlar i\u00e7in herhangi bir yer ayr\u0131lmaz, sadece ilgili s\u0131n\u0131fa ili\u015fkin nesne olu\u015fturuldu\u011funda yer alma i\u015flemi ger\u00e7ekle\u015ftirilir.<\/p>\n<p>A\u015fa\u011f\u0131da, bu durumu \u00f6zetleyen basit bir fig\u00fcr g\u00f6rebilirsiniz:<\/p>\n<p id=\"qftcfMb\"><img loading=\"lazy\" decoding=\"async\" width=\"779\" height=\"663\" class=\"alignnone size-full wp-image-1317 \" src=\"http:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/07\/img_5d3f549c6b83c.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/07\/img_5d3f549c6b83c.png 779w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/07\/img_5d3f549c6b83c-300x255.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/07\/img_5d3f549c6b83c-768x654.png 768w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/07\/img_5d3f549c6b83c-500x426.png 500w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/07\/img_5d3f549c6b83c-150x128.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/07\/img_5d3f549c6b83c-400x340.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/07\/img_5d3f549c6b83c-200x170.png 200w\" sizes=\"auto, (max-width: 779px) 100vw, 779px\" \/><\/p>\n<p>Burada tan\u0131mlanan de\u011fi\u015fkenlerin kapsam\u0131, <em>extern<\/em> olup\/olmamas\u0131 (harici ba\u011flama y\u00f6ntemi) gibi fakt\u00f6rleri de g\u00f6z \u00f6n\u00fcnde bulundurmak gerekiyor. Mesela,\u00a0<em>extern (harici)\u00a0<\/em>olmayan farkl\u0131 dosyadaki nesneler\/tan\u0131mlamalar <em>(dahili)<\/em>, ayn\u0131 tip ve isme sahip olsalar dahi farkl\u0131 olarak de\u011ferlendiriliyorlar ve bu sebeple de ba\u011flama hatas\u0131na sebebiyet vermiyorlar.<\/p>\n<p>Varsay\u0131lan olarak cpp dosyalar\u0131n\u0131zda tan\u0131mlad\u0131\u011f\u0131n\u0131z ve <em>const\u00a0<\/em>olmayan de\u011fi\u015fkenlerin hepsi\u00a0<em>extern,\u00a0<\/em>yani harici ba\u011flant\u0131s\u0131 var, olarak de\u011ferlendirilir. Bir di\u011fer ifade ile ba\u015fka dosyalarda da ayn\u0131 isimle de\u011fi\u015fken olursa ODR ihlal edilmi\u015f olur. Bunun\u00a0<em>non-extern<\/em> olarak tan\u0131mlanmas\u0131 i\u00e7in\u00a0<em>static\u00a0<\/em>anahtar kelimesini kullanabilirsin, ayr\u0131ca\u00a0<em>const\u00a0<\/em>global de\u011fi\u015fkenler de bu \u015fekilde de\u011ferlendirilebilir.<\/p>\n<p>A\u015fa\u011f\u0131da olas\u0131 b\u00fct\u00fcn tan\u0131mlamalar\u0131n oldu\u011fu \u00f6rnek kod par\u00e7as\u0131n\u0131 g\u00f6rebilirsiniz:<\/p>\n<pre class=\"lang:c++ decode:true \">\/\/ \u0130lklendirilmemis tan\u0131mlamalar:\r\nint gX;        \/\/ \u0130lklendirilmemis global de\u011fi\u015fken tan\u0131mlar(harici ba\u011flama)\r\nstatic int gX; \/\/ \u0130lklendirilmemis statik degisken tan\u0131mlar(dahili ba\u011flama)\r\nconst int gX;  \/\/ Derleme hatasi. Const de\u011fi\u015fkenler tan\u0131mland\u0131klar\u0131 yerde ilklendirilmelidirler\r\n \r\n\/\/ <em>Extern<\/em> anahtar kelimesi ile on tanimlamalar (<em>Forward declaration<\/em>):\r\nextern int gZ;       \/\/ Baska yerde tanimlanmis global degisken icin on tan\u0131mlama\r\nextern const int gZ; \/\/ Baska yerde tanimlanmis global <em>const<\/em> degisken icin on tan\u0131mlama\r\n \r\n\/\/ Ilklendirilmis tanimlamalar:\r\nint gY(1);        \/\/ \u0130lklendirilimis global degisken tan\u0131mlar (harici baglama)\r\nstatic int gY(1); \/\/ \u0130lklendirilimis statik degisken tan\u0131mlar (dahili baglama)\r\nconst int gY(1);  \/\/ \u0130lklendirilimis statik const degisken tan\u0131mlar (dahili baglama)\r\n \r\n\/\/ <em>extern<\/em> anahtar kelimesi ile ilklendirilmis tanimlamalar:\r\nextern int gW(1);       \/\/ \u0130lklendirilimis global degisken tan\u0131mlar (harici baglama) \r\n                        \/\/ (aslindaki yukaridaki tan\u0131mlama ile ayn\u0131 anlama geliyor, extern anahtar kelimesi gereksiz, cunku varsayilian olarak zaten degiskenler <em>extern <\/em>olarak kabul ediliyor)\r\nextern const int gW(1); \/\/ \u0130lklendirilimis statik const degisken tan\u0131mlar (harici baglama)<\/pre>\n<p>Bu konu (de\u011fi\u015fken kapsamlar\u0131, ba\u011flama y\u00f6ntemleri, \u00f6mr\u00fc) biraz daha su g\u00f6t\u00fcr\u00fcr ama bence ana fikri verdi\u011fimi d\u00fc\u015f\u00fcn\u00fcyorum. Merak edenler i\u00e7in bu konulara ili\u015fkin de bir ka\u00e7 kaynak ekliyorum, onlara da g\u00f6z atarsan\u0131z faydal\u0131 olacakt\u0131r.<\/p>\n<p>Evet bir yaz\u0131m\u0131z\u0131n da daha sonuna gelmi\u015f bulunuyoruz,\u00a0 bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek dile\u011fiyle.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Kaynaklar<\/strong><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/www.codingame.com\/playgrounds\/2205\/7-features-of-c17-that-will-simplify-your-code\/inline-variables\"><span style=\"color: #008000;\"><strong>https:\/\/www.codingame.com\/playgrounds\/2205\/7-features-of-c17-that-will-simplify-your-code\/inline-variables<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/cplusplus.programmingpedia.net\/en\/tutorial\/4907\/one-definition-rule-odr-\"><span style=\"color: #008000;\"><strong>https:\/\/cplusplus.programmingpedia.net\/en\/tutorial\/4907\/one-definition-rule-odr-<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.wikiwand.com\/en\/One_Definition_Rule\"><span style=\"color: #008000;\"><strong>https:\/\/www.wikiwand.com\/en\/One_Definition_Rule\u00a0<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/wg21.link\/p0386r2\"><span style=\"color: #008000;\"><strong>https:\/\/wg21.link\/p0386r2<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/language_linkage\"><strong>https:\/\/en.cppreference.com\/w\/cpp\/language\/language_linkage<\/strong><\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=MW3GMqVZNDg\"><span style=\"color: #008000;\"><strong>https:\/\/www.youtube.com\/watch?v=MW3GMqVZNDg<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/inline\"><span style=\"color: #008000;\"><strong>https:\/\/en.cppreference.com\/w\/cpp\/language\/inline<\/strong><\/span><\/a><\/li>\n<li><a href=\"http:\/\/www.drdobbs.com\/c-theory-and-practice\/184403437\"><strong>http:\/\/www.drdobbs.com\/c-theory-and-practice\/184403437<\/strong><\/a><\/li>\n<li><a href=\"https:\/\/www.wikiwand.com\/en\/ISO\/IEC_14882\"><span style=\"color: #008000;\"><strong>https:\/\/www.wikiwand.com\/en\/ISO\/IEC_14882<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/data_members\"><span style=\"color: #008000;\"><strong>https:\/\/en.cppreference.com\/w\/cpp\/language\/data_members<\/strong><\/span><\/a><\/li>\n<\/ul>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Evet arkada\u015flar, QT\u2019ye ili\u015fkin biraz ayd\u0131nland\u0131ktan sonra, haftal\u0131k C++ yaz\u0131lar\u0131m\u0131za, k\u0131sa bir kod par\u00e7as\u0131 yaz\u0131s\u0131 ile devam edelim (damarlara C++ zerk etmeye devam :). Bu yaz\u0131mda C++ 17 ile birlikte gelen Sat\u0131r Aras\u0131 De\u011fi\u015fkenleri (\u201cinline variables\u201d) kabiliyetinden bahsedece\u011fim. Bu kabiliyetin de kodunuzu daha okunakl\u0131 ve temiz hale getirece\u011fini d\u00fc\u015f\u00fcn\u00fcyorum a\u00e7\u0131k\u00e7as\u0131. Ayr\u0131ca sadece ba\u015fl\u0131k dosyalar\u0131ndan olu\u015fan&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,41],"tags":[524,525,521,526,523,522,529,527,528],"class_list":["post-1313","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","tag-const","tag-external-linkage","tag-inline-variables","tag-internal-linkage","tag-odr","tag-one-definition-rule","tag-static","tag-thread_local","tag-variable-duration"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Haftal\u0131k C++ 17 \u2013 Sat\u0131r aras\u0131 de\u011fi\u015fkenler kod par\u00e7as\u0131 ve tek tan\u0131m kural\u0131 - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[:tr]Haftal\u0131k C++ 17 \u2013 Sat\u0131r aras\u0131 de\u011fi\u015fkenler kod par\u00e7as\u0131 ve tek tan\u0131m kural\u0131[:en]Weekly C++ 17 \u2013 Inline variables and one definition rule code snippet[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Evet arkada\u015flar, QT\u2019ye ili\u015fkin biraz ayd\u0131nland\u0131ktan sonra, haftal\u0131k C++ yaz\u0131lar\u0131m\u0131za, k\u0131sa bir kod par\u00e7as\u0131 yaz\u0131s\u0131 ile devam edelim (damarlara C++ zerk etmeye devam :). Bu yaz\u0131mda C++ 17 ile birlikte gelen Sat\u0131r Aras\u0131 De\u011fi\u015fkenleri (\u201cinline variables\u201d) kabiliyetinden bahsedece\u011fim. Bu kabiliyetin de kodunuzu daha okunakl\u0131 ve temiz hale getirece\u011fini d\u00fc\u015f\u00fcn\u00fcyorum a\u00e7\u0131k\u00e7as\u0131. Ayr\u0131ca sadece ba\u015fl\u0131k dosyalar\u0131ndan olu\u015fan... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2019-07-29T21:24:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png\" \/>\n\t<meta property=\"og:image:width\" content=\"32\" \/>\n\t<meta property=\"og:image:height\" content=\"32\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Haftal\u0131k C++ 17 \u2013 Sat\u0131r aras\u0131 de\u011fi\u015fkenler kod par\u00e7as\u0131 ve tek tan\u0131m kural\u0131\",\"datePublished\":\"2019-07-29T21:24:15+00:00\",\"dateModified\":\"2019-07-29T21:24:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/\"},\"wordCount\":1283,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"const\",\"external linkage\",\"inline variables\",\"internal linkage\",\"odr\",\"one definition rule\",\"static\",\"thread_local\",\"variable duration\"],\"articleSection\":[\"C++\",\"Modern C++\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/\",\"name\":\"[:tr]Haftal\u0131k C++ 17 \u2013 Sat\u0131r aras\u0131 de\u011fi\u015fkenler kod par\u00e7as\u0131 ve tek tan\u0131m kural\u0131[:en]Weekly C++ 17 \u2013 Inline variables and one definition rule code snippet[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2019-07-29T21:24:15+00:00\",\"dateModified\":\"2019-07-29T21:24:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Haftal\u0131k C++ 17 \u2013 Sat\u0131r aras\u0131 de\u011fi\u015fkenler kod par\u00e7as\u0131 ve tek tan\u0131m kural\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[:tr]Haftal\u0131k C++ 17 \u2013 Sat\u0131r aras\u0131 de\u011fi\u015fkenler kod par\u00e7as\u0131 ve tek tan\u0131m kural\u0131[:en]Weekly C++ 17 \u2013 Inline variables and one definition rule code snippet[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/","og_locale":"tr_TR","og_type":"article","og_title":"[:tr]Haftal\u0131k C++ 17 \u2013 Sat\u0131r aras\u0131 de\u011fi\u015fkenler kod par\u00e7as\u0131 ve tek tan\u0131m kural\u0131[:en]Weekly C++ 17 \u2013 Inline variables and one definition rule code snippet[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Evet arkada\u015flar, QT\u2019ye ili\u015fkin biraz ayd\u0131nland\u0131ktan sonra, haftal\u0131k C++ yaz\u0131lar\u0131m\u0131za, k\u0131sa bir kod par\u00e7as\u0131 yaz\u0131s\u0131 ile devam edelim (damarlara C++ zerk etmeye devam :). Bu yaz\u0131mda C++ 17 ile birlikte gelen Sat\u0131r Aras\u0131 De\u011fi\u015fkenleri (\u201cinline variables\u201d) kabiliyetinden bahsedece\u011fim. Bu kabiliyetin de kodunuzu daha okunakl\u0131 ve temiz hale getirece\u011fini d\u00fc\u015f\u00fcn\u00fcyorum a\u00e7\u0131k\u00e7as\u0131. Ayr\u0131ca sadece ba\u015fl\u0131k dosyalar\u0131ndan olu\u015fan... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2019-07-29T21:24:15+00:00","og_image":[{"width":32,"height":32,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png","type":"image\/png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"8 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Haftal\u0131k C++ 17 \u2013 Sat\u0131r aras\u0131 de\u011fi\u015fkenler kod par\u00e7as\u0131 ve tek tan\u0131m kural\u0131","datePublished":"2019-07-29T21:24:15+00:00","dateModified":"2019-07-29T21:24:15+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/"},"wordCount":1283,"commentCount":2,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["const","external linkage","inline variables","internal linkage","odr","one definition rule","static","thread_local","variable duration"],"articleSection":["C++","Modern C++"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/","name":"[:tr]Haftal\u0131k C++ 17 \u2013 Sat\u0131r aras\u0131 de\u011fi\u015fkenler kod par\u00e7as\u0131 ve tek tan\u0131m kural\u0131[:en]Weekly C++ 17 \u2013 Inline variables and one definition rule code snippet[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2019-07-29T21:24:15+00:00","dateModified":"2019-07-29T21:24:15+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/07\/29\/haftalik-c-17-satir-arasi-degiskenler-kod-parcasi-ve-tek-tanim-kurali\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Haftal\u0131k C++ 17 \u2013 Sat\u0131r aras\u0131 de\u011fi\u015fkenler kod par\u00e7as\u0131 ve tek tan\u0131m kural\u0131"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1313","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=1313"}],"version-history":[{"count":8,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1313\/revisions"}],"predecessor-version":[{"id":1323,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1313\/revisions\/1323"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/174"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=1313"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=1313"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=1313"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}