C'nin C ++ 'dan farkı nedir?


21

Birçok insan, C ++ 'nın C' den tamamen farklı bir dil olduğunu söylemiştir, fakat Bjarne’nin kendisi C ++ 'nın C' den genişletilmiş bir dil olduğunu söylemiştir ++. Peki neden herkes C ve C ++ 'nın tamamen farklı diller olduğunu söylemeye devam ediyor? C ++, C ++ 'daki genişletilmiş özellikler dışındaki C ++' dan ne kadar farklıdır?


3
Nasıl kullanıldıklarından dolayı. C yi kesinlikle C ++ ile yazabilirsiniz ... ama yazmamalısınız.
Ed S.

Yanıtlar:


18

1980'lerde, C ++ gelişimi daha yeni başlıyorken, C ++ neredeyse C'nin uygun bir süpersetiydi.
Bununla birlikte, zaman içinde, diller arasındaki uyum her zaman önemli olarak kabul edilse de, hem C hem de C ++ gelişti ve birbirlerinden ayrıldılar.

Ek olarak, C ve C ++ arasındaki teknik farklılıklar bu dillerdeki tipik deyimleri ve “iyi uygulama” olarak kabul edilen şeyleri daha da farklılaştırmaktadır.

Bu, insanların "C / C ++ gibi bir dil yok" veya "C ve C ++ iki farklı dildir" gibi şeylerin arkasındaki itici faktördür. Hem bir C hem de bir C ++ derleyicisi için kabul edilebilir programlar yazmak mümkün olsa da, kodun genel olarak iyi bir C kodu örneği veya iyi bir C ++ kodu örneği olmadığı düşünülmektedir.


İlk paragrafın doğru olduğunu sanmıyorum. C'nin her zaman dolaylı bir oyuncu seçimi olduğuna inanıyorum, void *ancak C ++ hiç yapmadı. (Oy kullanmadı)
alternatif

5
@ mathepic: "Her zaman" ifadesini tanımlayın. C boşluğu * tipini C ++ 'dan aldı. K&R C’de malloc, char *
Nemanja Trifunovic

19

Stroustrup’un kendisi SSS’de cevaplar :

C ++, C'nin neredeyse tümünü alt küme olarak tutan doğrudan bir C'nin soyudur. C ++, C'den daha güçlü tip kontrolü sağlar ve doğrudan C'den daha geniş programlama stilleri yelpazesini destekler. C ++, daha iyi tip kontrolü ve daha iyi notasyon desteği ile C kullanarak yapılan programlama stillerini desteklemesi anlamında "daha iyi bir C" dir. Verimlilik). Aynı şekilde, ANSI C K & R C'den daha iyi bir C'dir. Ek olarak, C ++ veri soyutlama, nesne yönelimli programlama ve genel programlamayı destekler.

C "tamamen farklı" yapmak C ++ O nesne yönelimli programlama ve jenerik programlama için It destek olabilir neredeyse (eğer daha sıkı tür denetimi özen sürece) bir C ++ derleyicisi ile derlemek sonra saf C yazıp. Ama sonra hala C yazıyorsun - C ++ yazmıyorsun.

C ++ yazıyorsanız, nesne yönelimli ve şablon özelliklerinden faydalanıyorsunuzdur ve bu, C'de göreceğiniz hiçbir şeye benzemez.


“C de görecekleriniz gibisi yoktur” Bu ifade komik geliyor! "C’ye bakınız". C içinde C! Bu bir tür şiir.
Galaxy

13

Basitçe söylemek gerekirse, C de deyimsel olarak kabul edilen şey kesinlikle C ++ de deyimsel değildir.

C ve C ++, insanların onları kullanma biçimleri nedeniyle pratikte çok farklı dillerdir. C, birçok özelliğe sahip C ++ 'nın çok karmaşık bir dil olduğu minimalizmi hedefler .

Bazı pratik farklılıklar da vardır: C hemen hemen her dilden kolayca çağrılabilir ve çoğu zaman bir platformun ABI'sini tanımlar, oysa C ++ 'ın diğer kütüphanelerden kullanımı oldukça zordur. Çoğu dilde C + 'da FFI veya arayüz, hatta C ++' da (hatta java) uygulanan diller vardır.


4
C ++ kodunun sadece C ++ 'da aptalca olmadığı anlamına gelmez. C-tarzı kodlama, istisnai güvenlik eksikliği nedeniyle C ++ 'da problemlidir .
dan04,

4

C ++ 'ın nesne yönelimli programlamayı desteklediği açık gerçeğinden ayrı olarak, burada cevabınızı aldığınızı düşünüyorum: http://en.wikipedia.org/wiki/Compatibility_of_C_and_C++

Bu makale, C'de tamam olan ancak C ++ 'da olmayan şeyleri gösteren kod örnekleri içerir. Örneğin:

int *j = malloc(sizeof(int) * 5); /* Implicit conversion from void* to int* */

Bir C programının C ++ 'a taşınması genellikle basittir ve çoğunlukla derleme hatalarını düzeltmek (yayın ekleme, yeni anahtar kelimeler vb.) İçerir.


4
Böyle bir programı taşımak, size C ++ programını vermez. Size C ++ derleyicide derlenebilecek C verir. Bu C ++ yapmaz (hala sonuçtaki C kodunu çağırırım (sınıfları olan C bile)).
Martin York

@MartinYork Kötü C de, anlambilimin farklı olabileceğine dikkat çek. Sonuçta açıkça C olsa.
Deduplicator

2

C ++ sadece yeni özellikler değil, C'ye yeni kavramlar ve yeni deyimler de ekliyor. C ++ ve C yakından ilişkili olsa da, bir dilde etkili bir şekilde yazabilmek için o dilin tarzında düşünmeniz gerektiği gerçeği devam ediyor. En iyi C kodu bile, C ++ 'ın farklı güçlerinden ve deyimlerinden yararlanamaz ve bu nedenle aslında C ++ kodunun oldukça kötü olmamasından daha olasıdır .


2

"Gelişmiş özellikler", C ++ 'a ekledikleri, variadic makrolar veya başka şeyler gibi ses çıkarıyorsunuz. C ++ 'da "genişletilmiş özellikler" , dilin tamamen elden geçirilmesidir ve en iyi C uygulamalarının yerine geçer; çünkü yeni C ++ özellikleri, orijinal C özelliklerinin büyük çoğunluk durumlarında tamamen ve tamamen gereksiz olduğu orijinal C özelliklerinden çok daha iyidir. . C ++ 'ın sadece C'yi uzattığını öne sürmek, modern bir savaş tankının savaşı sürdürmek amacıyla bir tereyağlı bıçak kullanmasını önermektedir.


C ++ 'ta C'nin sahip olmadığı daha kullanışlı özelliklerden birine bir örnek verebilir misiniz?
Karanlık Tapınak

2
@DarkTemplar: RAII ile kolay mod kaynak yönetimi nasıl olur? Veya şablonları kullanarak hoş genel veri yapıları? Sadece başlamak için.
DeadMG

1

Aradaki fark, C'de usule göre düşünmek ve C ++ 'da nesne yönelimli şekilde düşünmek. Dilleri oldukça benzer ancak yaklaşım çok farklı.


C'nin de yapıları yok mu? C dosyaları kendileri ayrı modüller (temelde nesneler) değil mi? İşlemsel ve nesne yönelimi arasındaki kesin farkın ne olduğundan emin değil ...
Dark Templar

1
Karanlık sen benim fikrimi gösterdin. Prosedürel olarak veya nesne yönelimli bir şekilde yazmanıza izin veren dilin bir kısıtlaması değildir, bu bir ethos veya düşünme biçimidir.
Karınca

0

C ++, sözdizimsel olarak süper bir C kümesi olsa da, yani herhangi bir C programının yapısı C ++ derleyicisi tarafından derlenebilir.

Ancak, C ++ programlarında yaptığınız gibi bir C ++ programını hiçbir zaman yazmazsınız. Liste sınırsız olabilir veya birileri ayrıntılı rapor olarak koymak için daha fazla araştırma yapmalı. Ancak, önemli farklılıkları yapan birkaç işaretçi koyuyorum.

Mevcut yazının amacı, C ++ 'nın iyi bir C ++ programcılarının en iyi uygulamaları programlama olarak kullanmaları gerekmesine rağmen C eşdeğerini derlemesinin mümkün olması gibi özelliklere sahip olmasıdır.

C ++ 'dan C'ye göre nasıl yapılmalı

  1. Sınıflar ve Kalıtım. Bu, programlama ifadesini çok güçlü kılan sistematik nesne yönelimini sağlayan en önemli farklardır. Sanırım - bu nokta daha iyi bir açıklama gerektirmez. Eğer C ++ 'taysanız - neredeyse her zaman, sınıfları kullanmanız daha iyi olur.

  2. Özelleştirme - Sınıflar ve hatta yapılar özel üye olanlara sahiptir. Bu, bir sınıfın kapsüllenmesini mümkün kılar. C cinsinden eşdeğeri, nesneyi uygulamaya * boşluk olarak yazarak uygulamanın iç değişkenlere erişmesini engeller. Bununla birlikte, C ++ 'da hem özel hem de özel sınıfları olan elementlere sahip olabilirsiniz.

  3. Referans ile geçmek. C ++, geçiş işaretçilerinin gerekli olduğu referansa dayalı olarak değişiklik yapılmasına izin verir. Referansa göre kod, kodu çok temiz tutar ve işaretçi tehlikelerine karşı çok daha güvenli tutar. Siz de bir geçiş C tarzı işaretçi ve bu işe yarar - ama eğer C ++ iseniz daha iyi

  4. malloc ve ücretsiz olarak yeni & sil. New () ve delete () ifadeleri yalnızca belleği ayırmak ve ayırmakla kalmaz, aynı zamanda bir zincirde çağrılacak yıkıcının bir parçası olarak kodun yürütülmesine de izin verir. C ++ kullanıyorsanız - aslında malloc ve ücretsiz kullanmak KÖTÜ.

  5. IO tipleri ve operatör aşırı yüklenmesi Operatör aşırı yüklenmesi, iyi yapıldığında kodu okunabilir veya daha sezgisel hale getirir. << ve >> io operatörleri için aynı. Bunu yapmanın C yolu, fonksiyon göstericileri kullanmak olacaktır - ancak karışık ve sadece ileri programcılar için.

  6. "String" kullanarak. C'den gelen karakter * her yerde çalışır. Yani C ve C ++ hemen hemen aynı. Ancak, C ++ 'taysanız - sizi hemen hemen her şeyden oluşan dizilerin tehlikelerinden kurtaran String sınıflarını kullanmak her zaman çok daha iyidir (ve daha güvenlidir).

Özellikler C ++ 1 hayranı olmazdım . C de buna neredeyse hiç eşdeğer yok. Fakat normal bir günde - özellikle matematiksel olarak eksik yapıyorsanız.

  1. Akıllı işaretçiler - Evet, çok akıllılar! Ve çoğu akıllı şey gibi - iyi başlar ve daha sonra dağınık olur! Kullanmayı pek sevmiyorum

C hakkında sevdiğim ve C ++ 'da ıskaladığım şeyler

  1. Fonksiyon işaretçisi kullanarak polimorfik algoritmalar. C'de, karmaşık algoritmalar çalıştırdığınızda - bazı zamanlar işlev işaretçi kümesini kullanabilirsiniz. Bu, gerçek polimorfizmi güçlü bir şekilde yapar. Eğer C olduğunda ++ sen CAN işlev işaretçileri kullanmak - ama bu kötü. Sadece yöntemleri kullanıyor olmalısın - başka biri dağınık olmaya hazır ol. C ++ sınıflarındaki tek polimorfizm biçimi işlev ve operatör aşırı yüklenmesidir ancak bu oldukça sınırlayıcıdır.

  2. Basit konular Konu oluştururken pthreads vardı - bu oldukça basit ve yönetilebilir. Sınıflara "özel" olması gereken iş parçacıkları oluşturmanız gerektiğinde (özel üyelere erişebilmeleri için) olur. Hızlandırıcı çerçeve türleri var - fakat temel C ++ 'da hiçbir şey yok.

Dipan.


0

Bazı dil özellikleri, ek olsalar bile, dilin pratikte kullanılması gereken yolu değiştirebilir. Bir örnek olarak, bu durumu göz önünde bulundurun:

lock_mutex(&mutex);

// call some functions
...

unlock_mutex(&mutex);

Yukarıdaki kod C ++ 'da uygulanan arama işlevlerini içeriyorsa, bu işlev çağrılarından herhangi birinin atabileceği ve bu istisnai yollardaki muteksin kilidini asla açamayacağımız için bir sorun dünyasında olabiliriz.

Yıkıcılar, programcıların bu noktada kaynakları serbest bırakmayı / serbest bırakmayı unutmamalarına yardımcı olmak için artık elverişli değildir. RAII pratik bir gereklilik haline gelir, çünkü önemsiz olmayan örneklerde fırlatabilecek her bir kod satırını önceden tahmin etmek insanca mümkün değildir (bu satırların şimdi atmayacağını ancak daha sonra değişikliklere neden olabilir). Başka bir örnek al:

void f(const Foo* f1)
{
    Foo f2;
    memcpy(&f2, f1, sizeof f2);
    ...
}

Bu tür kod, genellikle C'de zararsız olsa da, C ++ 'da tahribata yol açan cehennem ateşi gibidir, çünkü memcpybuldozlar bu nesnelerin bitleri ve baytları üzerinde bulunur ve kopya yapıcılar gibi şeyleri atlar. Böyle fonksiyonlar gibi memset, realloc, memcpy, vb C geliştiriciler arasında günlük araçlar bit oldukça homojen bir şekilde eşyalara bakıp kullanılan ve bellekte bayt iken, C daha karmaşık ve daha zengin tipi sisteminin ++ ile uyumlu değildir. C ++, kullanıcı tanımlı türlerin çok daha soyut bir görünümünü teşvik eder.

Dolayısıyla, bu tür şeyler artık C ++ 'a, onu doğru kullanmak isteyen biri tarafından, C'nin salt bir "süperseti" olarak bakmalarına izin vermez. Bu diller, çok farklı bir zihniyet, disiplin ve en etkili şekilde kullanma şeklini gerektirir. .

C ++ 'ı her yönden dürüst olarak gören kampta değilim ve aslında en sevdiğim üçüncü taraf kütüphanelerim bir sebepten ötürü C kütüphaneleridir. Neden tam olarak bilmiyorum ama C libleri doğada daha minimalist olma eğilimindedir (belki de böyle zengin bir tür sistemin bulunmaması, geliştiricilere bazı büyük ve katmanlı soyutlamalar yapmadan gerekli asgari işlevselliği sağlamaya odaklandığından dolayı), ancak çoğu zaman sadece kullanımlarını kolaylaştırmak ve uyarlamak için etraflarına C ++ sarmalayıcıları koymakla bitirdim, ancak bunu yaparken bile minimalist bir yapı benim için tercih ediliyor. Minimalizmi bu tür nitelikleri aramak için fazladan zaman harcayanlar için bir kütüphanenin çekici bir özelliği olarak seviyorum ve belki de C bunu teşvik etme eğilimindedir.

C ++ 'ı çok daha fazla tercih etmiyorum, ancak C API'lerini genellikle en geniş ikili uyumluluk için (ve FFI'ler için) kullanmam gerekiyor, ancak C ++' ı başlıkları için C kullanmasına rağmen uyguladım. Ancak bazen, bir bellek ayırıcısı veya çok düşük seviyeli bir veri yapısının seviyesine (gerçekten gömülü programlama yapanlar arasında daha fazla örnek olduğundan emin olabilirsiniz) olduğu gibi, gerçekten düşük seviyeli olduğunuzda, bazen yararlı olabilir. Çalıştığınız türlerin ve verilerin, değişkenler, maliyet düşürücüler ve yıkıcılar gibi belirli özelliklerin olmadığını varsayabiliriz; böylece bunları karıştırmak, kopyalamak, serbest bırakmak, yeniden tahsis etmek için bit ve bayt olarak değerlendirebiliriz. Çok düşük seviyeli problemlerde, C'nin sağladığı çok daha basit tip bir sistemle çalışmak bazen yararlı olabilir.

Açıklama

Buradaki ilginç bir yorum, biraz daha derinlemesine cevap vermek istedim (buradaki yorumların karakter sınırlaması konusunda çok katı olduğunu düşünüyorum):

memcpy(&f2, f1, sizeof f2); Foo'nun sahip olduğu herhangi bir işaretçi varsa ya da daha da kötüsü ise, bununla başa çıkacak araçlara sahip olmadığınızdan C de “cehennem ateşi salgını” olur.

Bu adil bir nokta ama odaklandığım her şey ağırlıklı olarak C ++ 'ın tip sistemine ve ayrıca RAII'ye odaklanarak. X-rayish bayt kopyalama nedenlerinden biri memcpyveya qsortfonksiyonların türleri daha az C pratik bir tehlike teşkil imha olmasıdır f1ve f2(onlar bile önemsiz olmayan yıkımını gerekiyorsa) yıkıcılar resmin içine taşıdığınızda yukarıda oysa açık olan , örtük ve otomatik hale gelirler (genellikle geliştiricilere büyük değer verir). Bu, vptr'ler gibi gizli durumlardan bile bahsetmiyor. f1İşaretçiler varsa vef2sığ, onları geçici bir bağlamda kopyalar, daha sonra ikinci kez işaretçilere sahip olanları açıkça serbest bırakmaya çalışmazsak sorun olmaz. C ++ ile bu derleyici otomatik olarak yapmak isteyeceği bir şeydir.

Ve bu, eğer tipik olarak C’de, eğer Foo in in If in in in If If if if bigger bigger bigger bigger typically typically that typically that that that that that that that that that that that that that that that that that that that that that that that that that that becomes becomes becomes becomes becomes ümk ümişe ve bu , “ Foo'nun imleciye sahip olması durumunda”, çünkü kaynak yönetimi ile istenen açıklık, genellikle, C ++’da, artık önemsizce bir UDT yapamayacağımıza, genellikle gözardı edilmesi zorlaştıracaktır. constructible / yıkılabilir sadece o trivially constructible / tahrip olmayan herhangi üye değişkeni depolamak yapma (yine genellikle çok yararlı olur bir bakıma, ama biz gibi kullanım fonksiyonları için cazip değilse tarafından memcpyveya realloc).

Benim asıl amacım, bu açıklığın herhangi bir yararını tartışmaya çalışmak değil (eğer varsa, insan hatalarının artmış olma ihtimalinin dezavantajları ile neredeyse her zaman tartılır) derdim, fonksiyonları gibi memcpyve memmoveve qsortve memsetvereallocve böylece UDT'lerin C ++ gibi özellikler ve yetenekler bakımından zengin bir dilde yeri yoktur. Ne olursa olsun var olsalar da, C ++ geliştiricilerin büyük çoğunluğunun veba gibi bu tür işlevlerden kaçınmanın akıllıca olacağını söylemeye itiraz edilmeyeceğini düşünüyorum. Tip sisteminin çok daha basit ve belki de “daha ​​açık” olması nedeniyle C’de daha az sorun yaşadıklarını savunuyorlar. X-raying C tipleri ve bunları bit ve bayt olarak ele almak hataya açıktır. Bunu C ++ 'da yapmak kesinlikle açık bir şekilde yanlış çünkü bu tür fonksiyonlar dilin çok temel özelliklerine ve tip sistemini neyin desteklediğine karşı savaşıyor.

Bu aslında C'nin en büyük çekiciliği, ancak, özellikle de dil birlikte çalışabilirliği ile ilgili. C # 'nin FFI gibi bir şeyin C +' nin tam gelişmiş tip sistemini ve dil özelliklerini, inşaatçılar, yıkıcılar, istisnalar, sanal fonksiyonlar, fonksiyon / yöntem aşırı yüklemesi, operatör aşırı yüklemesi, tüm çeşitli tiplerde anlamasını sağlamak çok daha zor olurdu. Kalıtım, vb. C ile, birçok farklı dilin doğrudan FFI'ler üzerinden veya dolaylı olarak bazı C API dışa aktarma işlevleri yoluyla istenen biçimde (örneğin: Java Yerel Arabirimi) içe aktarabileceği şekillerde API'ler kadar standart hale gelen nispeten basit bir dildir. ). Ve C'yi kullanmaktan başka çarem kalmadı, bu dilin birlikte çalışabilirliği bizim durumumuzda pratik bir gereklilik.

Ama biliyorsun, ben pragmatistim (ya da en azından olmaya gayret ediyorum). Eğer C bu kadar fakir ve kederliyse, hataya açık, pis bir dil C ++ meraklısı arkadaşlarımdan bazıları olduğunu iddia etti (ve bir şekilde kendi tarafımdan C nefretine yol açmamış olması dışında kendime bir C ++ meraklısı saydım.) Aksine, her iki dili de kendi açılardan ve farklılıklar konusunda daha iyi takdir etmemi sağlama konusunda tam tersi bir etkiye sahipti), o zaman ben gerçek dünyada en ılımlı ve en sızan bir biçimde ortaya çıkmasını bekliyorum. güvenilmez ürünler ve kütüphaneler C'ye yazılmıştır. Bunu bulamıyorum. Linux'u seviyorum, Apache'yi, Lua'yı, zlib'i, OpenGL'yi bu tür değişen donanım gereksinimlerine, Gimp, libpng, Kahire vb. En azından, dilin pozlarını engelleyen her ne olursa olsun, yetenekli ellere bazı güzel kütüphane ve ürünler yazabildiğim kadar etkileyici görünmüyor ve gerçekten ilgilendiğim tek şey bu. Bu yüzden en tutkulu olanlarla hiç ilgilenmedim. pragmatik bir temyizde bulunmak ve "Hey, orada harika şeyler var! Nasıl yaptıklarını öğrenelim ve belki de dilin deyimsel doğasına özgü olmayan, geri getirebileceğimiz güzel dersler vardır. hangi dilde kullanıyorsak onu kullanalım. " :-D


2
memcpy(&f2, f1, sizeof f2);eğer aynı zamanda C "cehennem ateşi hükümdarlık tahribat" dır Fooherhangi sahibi işaretçileri varsa veya gibi daha da kötü de bununla başa çıkmak araçları yoksundur. Yani C yazan insanlar böyle şeyler yapmaz
Caleth

@Caleth Sahip olan işaretçilerle bile, sahip olan işaretçilerin açıkça serbest bırakılmasıyla basitleştirenlerin bir kısmı, bu nedenle, örneğin orijinal hafızayı hala serbest bırakan tek bir yerde, örneğin (bazı durumlarda, dizayn). Yıkıcıların katılımıyla, her iki Fooörnek de şimdi dinamik diziyi, vektörü veya bu etkiye yönelik bir şeyi yok etmek isteyebilir. Bazı tuhaf durumlara sıklıkla, yıkımın örtük olmaktan ziyade açık olduğu gerçeğine dayanmak için bazı veri yapıları yazabilmenin faydalı olacağını düşünüyorum.
Dragon Energy,

@Caleth Kuşkusuz ki tembel bir şey çünkü benim Foosahip olduğum herhangi bir işaretçi varsa, uygun bir kopyala / taşı ctor, dtor, değer semantiği vb. Kullanabiliriz ve çok daha zengin ve daha güvenli bir kodumuz olabilir. Ancak zaman zaman kendimi C'ye ulaşırken, veri yapısını veya tahsisatçıyı homojen bit ve bayt düzeyinde genelleştirmek istediğim durumlarda, dar kullanım durumlarında basitleştirilebilecek türler üzerinde yapabileceğim bazı varsayımlar ile biraz böyle varsayımlarla biraz C konusunda kendimi daha güvende hissedeceğim
Dragon Energy

@Caleth Benim durumumda, ara sıra düzenleme ve erişim için (ve genellikle bu vakalar POD'lardan başka bir şey içermez) bellekte bulunan bit ve bayttan daha fazla bir şey olarak bakmanın bir yararı bulamadığım mimarinin bazı temel taşları vardır. Bunlar hala C'yi tercih ettiğim yerde kalan birkaç tuhaf dava. Hafıza tahsisatını hayal ediyorsanız, bit ve bayttan, işaretçilerden, bu tür şeylerden, hizalama ve havuzlamaya odaklanmadan daha fazla çalışacak bir şey yok. ve bitleri ve baytları dağıtıyorlar ve bu çok özel durumlarda C'nin C ++ 'dan daha az engel sunduğunu düşünüyorum.
Dragon Energy,

Bazen C'ye ulaştığım diğer durum, daha az soyut olmak ve ilkellere odaklanmak suretiyle, kodun aslında daha genelleştirilebileceği ve yeniden kullanılabileceği durumlar ( API void filter_image(byte* pixels, int w, int h);örneğin, API void filter_image(ImageInterface& img);kodumuzu bu tür görüntü arayüzüne bağlayacak). uygulanabilirliğini daraltmak). Bu gibi durumlarda, bazen C ++ 'ta kazanılacak çok az şey olduğu için bu işlevleri yerine getiririm ve bu kodun gelecekteki değişikliklere ihtiyaç duyması olasılığını azaltır.
Dragon Energy,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.