"C" ning ushbu kalit so'zidan foydalanish oqilonami?

Asosan, menda C ning inline funksiyasi bor:

struct array {
    unsigned long size;
    void* items;
};
typedef struct array* Array;
inline Array array_create(unsigned long initsize);
inline void  array_free(Array this);

Bunday holatda this kalit so'zini ishlatishim mumkinmi yoki undan qochish yaxshimi va nima uchun (emas)?

EKRAN: Ushbu savol mening kodimdagi xatolardan kelib chiqqan inline void array_free (Array array); , natijada sizeof (array); natijasini o'zgartirib, sizeof (struct array); ga moslashtirish o'rniga this dan foydalaning.

0
bu C-da kalit so'z emas.
qo'shib qo'ydi muallif Kerrek SB, manba
@Nasser: Bu savolning yolg'on ma'lumotlarga asoslanganligini o'zgartirmaydi. "Eng kichik ijobiy raqamni boshlang'ich qiymat sifatida ishlatish oqilona bo'ladimi?"
qo'shib qo'ydi muallif Kerrek SB, manba
Haqiqatan ham, istalgan biron-bir tarzda noqonuniy so'zlardan foydalanishingiz mumkin. Bu haqiqatan ham fikrga oid savoldir.
qo'shib qo'ydi muallif David Hoelzer, manba
@YoYoYonnY To'liq. Menimcha, bu juda dahshatli fikr, lekin, ha, bu mening fikrim. Bu butunlay qonuniydir.
qo'shib qo'ydi muallif David Hoelzer, manba
void array_free (Array this); - ob'ektni emas, balki markerni o'tkazadigan C ++ dasturchisi sifatida juda bo'lardi. IMO bu this dan foydalanishdan ko'ra yomonroqdir. :-)
qo'shib qo'ydi muallif Bo Persson, manba
Hech narsa noto'g'ri, chunki siz ushbu kodni C ++ ga "portlash" deb niyat qilmoqchi emassiz. Aslida, agar sizning maqsadingiz array_free Array ning "usuli" bo'lsa, demak, u niyatingizni o'quvchi bilan bog'lash orqali o'qiydiganlikni yaxshilaydi.
qo'shib qo'ydi muallif Theodoros Chatzigiannakis, manba
Masalan, nima uchun new va delete emas, balki this ?
qo'shib qo'ydi muallif nasser-sh, manba
@KerrekSB O'ylaymanki, o'shimcha OP "oqilona" emasligini so'rayapti, agar u "haqiqiy" bo'lsa,
qo'shib qo'ydi muallif nasser-sh, manba
Keyin C ++ kalit so'zini C.da ishlatish uchun OK-ni so'rashingiz kerak. Ammo boshqa C ++ kalit so'zlari haqida nima deyish mumkin?
qo'shib qo'ydi muallif juanchopanza, manba
Nima uchun ushbu C ++-ni ishlating? Yaxshiyamki, this - Cda kalit so'z emas, shuning uchun nima so'rayotganligingiz aniq emas.
qo'shib qo'ydi muallif juanchopanza, manba
Shuning uchun unvon nomi "C kodidagi kalit so'zini ishlatish oqilonami?" this , C'de kalit so'z emas, chunki?
qo'shib qo'ydi muallif juanchopanza, manba
Muqobil ravishda self ni taklif qilaman.
qo'shib qo'ydi muallif el.pescado, manba
"C ++ da bu kalit so'zni ishlatishingiz mumkin." - Yo'q, siz qila olmaysiz. void f (bu int} {} - derleyici xatosi.
qo'shib qo'ydi muallif Christian Hackl, manba
Agar biror narsa noaniq yoki shubhali ekanligiga ishonchingiz komil bo'lmasa, demak, boshqa odamlar ham noaniq yoki tushunarsiz bo'lishi mumkin deb o'ylashadi .... bu noaniq va chalkash ma'noga ega degan ma'noni anglatadi, shuning uchun siz bunga amin bo'lishingiz mumkin. Hech qanday noma'lum va bosh karıştırıcı kod yozish yomon, shuning uchun faqat buni qilmang.
qo'shib qo'ydi muallif J..., manba
C ++ da siz ushbu kalit so'zni ishlatishingiz mumkin. Biroq, uni dastlabki ro'yxatlarda ishlata olmaysiz. Shu sababli, ushbu kalit so'zdan tashqari o'zingizning a'zolaringizni turli argumentlardan farqli ravishda boshqalarga nomlash oqilona.
qo'shib qo'ydi muallif Jens Munk, manba
@ el.pescado Bu aslida ajoyib g'oya. Bunga sodiq qoling.
qo'shib qo'ydi muallif YoYoYonnY, manba
@DavidHoelzer bu o'qilishi mumkinligi haqida ko'proq ma'lumotga ega, ammo ha, texnik jihatdan okunabilirlik hamma narsaga tegishli.
qo'shib qo'ydi muallif YoYoYonnY, manba
@juanchopanza bilaman, chunki bu Cda kalit so'z emas (C ga etiketlasa, men javob olaman), lekin C ++ dasturchilari ushbu sintaksisni ko'rishni biladimi (C bo'lsa ham) yoki ular array kabi narsalarni afzal ko'rsalar. Maqsadim kodni o'qilishi mumkin.
qo'shib qo'ydi muallif YoYoYonnY, manba
@juanchopanza Lekin C ++ da kalit so'z, bu nima uchun men savolni C ++ tagiga kiritdim va nima uchun kalit so'zini qismini qo'shganman. Mening maqsadim this (yoki self , ajoyib g'oya) funktsiyasi ichida o'zgartirilishi mumkin bo'lgan sinfga o'xshash ob'ektni nazarda tutishdir. narsa kabi narsalarni ishlatish, faqat defentiti o'qigan ( void array_set (Array thing, unsigned long loc, void * it)) men uchun o'qiydigan bo'lsam) Buning uchun array ni ishlatganman, lekin savolda o'qiganingiz kabi, bu aniqlangan tuzilmalarga zid.
qo'shib qo'ydi muallif YoYoYonnY, manba
@juanchopanza Boshqa C ++ kalit so'zlari uchun ularni C da bir xil maqsadda ishlatish mumkin emas. this kalit so'zi C va C ++ da bir xil ma'noga ega bo'lishi mumkin (yoki hech bo'lmaganda mening kod), shuning uchun uni Cda ishlatish oqilona bo'ladimi, deb so'radim. (Bu xuddi shu ma'noga ega, lekin u bir xil dasturlash tilidir, shuning uchun men uni ko'rsatsa, chalkashlik va o'qilmaydi deb so'raganman) C kodi)
qo'shib qo'ydi muallif YoYoYonnY, manba
"bu" faqat bitta sinf misoliga const ko'rsatkichini ifodalovchi C ++ kalit so'zi va sinf a'zolari funktsiyalaridan to'g'ridan-to'g'ri kirish imkoniyatiga ega.
qo'shib qo'ydi muallif DNT, manba

7 javoblar

Texnik jihatdan to'g'ri, chunki C C ++ emas, shuning uchun this - Cda kalit so'z emas.

don bo'lsin, endi bu boshqa savol. Agar ushbu kod bo'lagi hech qachon C ++ sifatida to'plansa, u holda this deb ataladigan identifikator kodni buzadi.

8
qo'shib qo'ydi

Istagan har qanday usulda this dan foydalanish butunlay amal qiladi.

O'zingizdan savol so'rashingiz kerak, bular har qanday C ++ bilan himoyalangan so'zlar uchun class , final va boshqalar. Kabi amal qiladi:

  • this so'zini noto'g'ri xabarni bekor qiluvchi kalit so'z sifatida ta'kidlaydigan dasturdan foydalanamanmi? Masalan, .c faylida bo'lganingizda ham, Visual Studio'nun bu ni ta'kidlaydi. Shunday qilib, ba'zi bir tartibsizliklar paydo bo'lishi mumkin.
  • Kelajakda kodimni C ++ ga targ'ib qilishni rejalashtiryapmanmi? Bunday holatda siz undan qochishingiz mumkin bo'lgan qo'shimcha ishni bajarasiz.
  • Mening kodim C ++ bilan ishlaydimi? Bu o'z-o'zidan muammo emas, lekin sizning kodingiz C ++ dasturchilariga ham ta'sir o'tkazishini unutmang. Va sizning C ni tanimaydigan odamlarni chalkashtirmasligingiz mumkin (garchi kimdir o'z vazifalari boshqa tilni o'qiyotganda nimalar qilayotganlarini bilsalar ham).

this , undan qochib qutulish mumkin bo'lgan narsadir, chunki u axloqsiz, ammo noto'g'ri emas.

Javobni yozishdan oldin C ++ tilini o'rganishingiz kerakligini aytmayapman, lekin bir narsani bilganingizdan so'ng, uni yaxshi ishlatish yaxshi amaliyotdir.

Sizga olib kelishi mumkin bo'lgan jiddiy muammo - kodingizni C ++ dan talab qilinmaydigan qilib yaratishdir, masalan, a

#define this some_definition

Keyin C ++ dan olingan C header faylida kodingizga g'alati effektlar bo'lishi mumkin.

6
qo'shib qo'ydi
@ChristianHackl Bundan tashqari, VS12 dan buyon aniqlanganmi yoki yo'qligini bilmayman, agar sizda biron bir ma'lumot kerak bo'lsa, lekin menimcha, EDG faqat C ++
qo'shib qo'ydi muallif Nikos Athanasiou, manba
@ChristianHackl va boshqalar men topishim mumkin bo'lgan eng oddiy misol edi. this ni bir necha marta ta'kidlagan holda .c fayli bilan yakunladim. Siz aytganlaringiz barcha versiyalarga taalluqli emas. bu yerda tekshiring
qo'shib qo'ydi muallif Nikos Athanasiou, manba
@Peter umumiy so'zlar haqida gapirishni xohladi. ajratilgan so'z atamasi bilan tartiblangan kalit so'z
qo'shib qo'ydi muallif Nikos Athanasiou, manba
final - kalit so'z emas, C ++ ning so'nggi versiyalarida identifikator.
qo'shib qo'ydi muallif Peter, manba
Sizning birinchi fikringiz noto'g'ri. VS IDE, /TC derleyici bayrog'iga mos keladi, fayl nomi tugamaydi va this uchun to'g'ri rangdan foydalaning.
qo'shib qo'ydi muallif Christian Hackl, manba
@NikosAtaniyoou: Bilmadim, VC 2013 Express Edition bilan uni sinovdan o'tkazdim va u erda yaxshi ishladi. Ammo, agar siz ushbu kompilyatsiya birligini "C" deb yozsangiz (aslida, * .cpp fayllari bilan ishlaydi).
qo'shib qo'ydi muallif Christian Hackl, manba

C standartidagi bu kodini ishlatmaslik sabablari sizning kodingizni yaratadi:

  1. this "C ++" da "mashhur" foydalanish uchun juda oz o'qilishi mumkin. Sizning kodingiz C ++ kabi ko'rinishi mumkin va uninformatsiyalanmagan o'quvchi osongina chalkashtirishi mumkin.
  2. C ++ uchun noyob. Agar siz (yoki boshqa biror kishi) ushbu kodni olishni istasangiz va uni C ++ kompilyatsiyasida ishlatmoqchi bo'lsangiz, u bajarilmaydi. Bu bir vaqtning o'zida salbiy va ayanchli ahvolga tushib qoladi, chunki xatolikka yo'l qo'ymaslik kerak, shuning uchun g'amxo'rlik qilish kerak, qaerda bo'lmasin, muhim muammolar yuzaga kelishi mumkin.
5
qo'shib qo'ydi
Hali mening kodimning qaysi tili haqida o'ylashni xohlagan odamlarni o'ylamagandim. Bu javobni, hech kimning C kodini bu dan foydalanish uchun yaxshiroq sabablar bilan kelgan holda qabul qilaman.
qo'shib qo'ydi muallif YoYoYonnY, manba

Sizning maqsadingiz nima bog'liq.

Agar sizning C kodingiz dasturi har doim C ++ kompilyatori bo'lmagan S kompilyatori bilan qurilgan bo'lsa, kodingizda identifikator sifatida this dan foydalanmasligingizda hech qanday farq yo'q. Bu ajratilgan identifikator emas, shuning uchun uni ishlatishingiz mumkin.

Ushbu premise bilan bog'liq mumkin bo'lgan muammo shundaki, bir qator asosiy C derivatorlari aslida C ++ kompilyatorlari yoki ba'zi C ++ xususiyatlarini kengaytma sifatida qo'llab-quvvatlaydi, ular sizning kodingizni rad etishi mumkin (yoki kamroq ehtimol - bu siz kutmasligingiz mumkin) ). Sizning kompilyatoringiz (lar) ning sotuvchisi hech qachon (hatto sizlarga yozma so'z berganda ham) sizning C derivatoringizning kelajakdagi versiyasini chiqarib yuborishi mumkinligi haqida mutlaq ishonch bilan taxmin qilish mumkin emas. kodi. Bu sodir bo'lish ehtimoli nisbatan past, lekin nol bo'lmagan.

Natijada kelajakda sizning kodingizni saqlab qolish uchun qanday xavf-xatarni hal qilishingizni hal qilishingiz kerak.

Albatta, siz C ++ (ha, bunday odamlar mavjud) bilan sizning kodingizni C ++ ga mos kelmaydigan qilib qo'yishni istagan C fanatik bo'lsangiz, C ++ ga xos kalit so'zlar yoki ajratilgan identifikatorlarni ishlatib, shuningdek bunday kalit so'zlarni yoki identifikatorlarni (C ning keyingi versiyalariga) xos bo'lgan qiymatli yondoshuv bo'lishi mumkin.

1
qo'shib qo'ydi
@peter this bilan duch kelganida C derivatorlari misollari bormi?
qo'shib qo'ydi muallif juanchopanza, manba
this (ba'zi bir boshqa xato bilan koddan tashqari) duch kelganda @yuan - C kompilyatorlari paydo bo'lmaydi. Biroq, C ++ kompilyatorlari this dan foydalanishni rad etmaydi.
qo'shib qo'ydi muallif Peter, manba
@YoYoYnnY: C zamonaviy vositalardan foydalanganda S tezroq emas. Lekin siz dasturni sekinroq qilish uchun ikkala tilni noto'g'ri ishlatishingiz mumkin.
qo'shib qo'ydi muallif Christian Hackl, manba
@YoYoYnnY: Buning bajarilish tezligi bilan nima aloqasi bor? Yoki siz derleme tezligini nazarda tutasizmi?
qo'shib qo'ydi muallif Christian Hackl, manba
@ChristianHackl C ++ va boshqalarni ishlatish haqida. S dan kam emas C ++ dan foydalanish mening kodimni hozirgi C raqibini tezroq ushlab turish uchun etarli darajada sekinlashtirishi mumkin deb qo'rqaman. Shuningdek, array turi loyihamning asosiy markazida emasligini, lekin Cda ko'plab sinfga o'xshash kodlardan foydalanganimdan va this Bu savolni men so'radim.
qo'shib qo'ydi muallif YoYoYonnY, manba
C ++ xususiyatlarini tadbiq qiluvchi C (99) kompilyatorlari mavjudligini bilmasdim. Men C ++ ni buzishni niyat qilmayman, faqat kodimning iloji boricha tezroq bo'lishini xohlayman. Bu esa this -ni ishlatmaslikning yana bir katta sababi hisoblanadi: C ++ xususiyatlarini tatbiq qiladigan ba'zi C kompilyatorlarini buzishi mumkin.
qo'shib qo'ydi muallif YoYoYonnY, manba

Yuqorida aytib o'tilganidek, har qanday ajratilmagan kalit so'zni o'zgarmaydigan nom sifatida ishlatishingiz mumkin. Shu bilan birga, men "structMaster", yoki "struct [name] this" yoki shunga o'xshash narsalarni "struct struct" dan foydalanishingiz mumkin. C ++ sinfining a'zo funktsiyalariga o'xshash tarzda ishlatilishi kerak.

Shunday qilib, sizning kodingiz yanada o'qiydi va sizning maqsadingiz uni ishlatadigan shaxs tomonidan tushuniladi.

1
qo'shib qo'ydi
Siz taklif qilgan kabi, ehtimol, this , ehtimol, self uchun muqobil foydalanasiz.
qo'shib qo'ydi muallif YoYoYonnY, manba
pThis , albatta, mening tarzi emas, afsuski, mening kodni kamroq o'qiydi. @ el.pescado bo'lsa ham self ni ishlatish yaxshi fikr edi.
qo'shib qo'ydi muallif YoYoYonnY, manba
Albatta, men bir necha nomdagi g'oyalarni tashladim, ammo yakuniy uslub, albatta, o'qib-o'rganishni kuchaytirishi kerak.
qo'shib qo'ydi muallif DNT, manba

Ha sen qila olasan. Agar kod C ++ sifatida to'plansa, bu sizning aybingiz emas. Biroq, bunday hollarda boshqa narsalar qabul qilinmaydi; masalan, C ++-dan farqli o'laroq, C-dan farqli o'laroq ruxsat berilmagani uchun, elements -ga tegmasdan belgilash ehtimoli bor.

0
qo'shib qo'ydi

Javobingizda this kalit so'zingiz yo'q. Faqat C ++ va sinfda, shuning uchun sizning kodingiz C va siz bu o'zgaruvchisini qator uslubiga kiradigan mahalliy usul parametr sifatida ishlatasiz.

0
qo'shib qo'ydi