რამეში ვერ უგებენ C და C++ ერთმანეთს? თუ . . . 1
ერთ-ერთ ცნობილ პროგრამისტს - შილდტს თავის ერთ-ერთ პოპულარულ ბესთსელერში მოყვანილი აქვს რამოდენიმე მნიშვნელოვანი განსხვავება C და C++-ს შორის. ეს განსხვავებები ეხება ამ ორ ენაში არსებულ სანდარტებს, მაგრამ როგორც ცნობილია კონკრეტული ფირმის კონკრეტულ კომპილატორებში არის ერთდროულად, როგორც მხარდაჭერა სტანდარტისადმი, ასევე საკმაო გადახრა მისგან. როგორც წესი განსაკუთრებულ ორიგინალობას ყოველთვის Microsoft-ი იჩენს ხოლმე; ვნახოთ როგორ არის რეალიზებული მის პროდუქციაში ამ პროგრამირების ენის პროგრესის ფენომენი. ვიყენებ შემდეგ კომპილატორებს: MS Visual C++ 7.0 და MS Quick C 2.0. “თუ C++-ში ფუნქცია აბრუნებს void-ისაგან განსახვავებულ ტიპს, მაშინ return ინსტრუქციაში უნდა იყოს ასეთივე ტიპის მნიშვნელობა”. ვნახოთ რა ხდება პრაქტიკაში; ჯერ დავადგეთ C-ს: #include "stdio.h" int F(void); აი რას დაგვიწერს პროგრამა შესრულების შემდეგ:
ესე იგი შედეგი ნორმალურია. პასუხია 2. ახლა შევცვალოთ მნიშვნელობა - ვთქვათ, 2-ის მაგიერ 2.3423: პროგრამა დაწერს ისევ 2-ს; ზუსტად ასევე იქცევა C++-იც. სხვათაშორის ეს, ამ ორივე ენის საერთო სენია; მაგალითად, პასკალისგან განსხვავებით, რომელიც ტიპების შეუსაბამობის დროს მაშინვე გამოიჩენს ჯელნტმენობას და გამოიტენს შეტყობინებას შეცდომის შესახებ, C++-ს გამოაქვს ერთი გაფრთხილება, რომ შეიძლება მოხდეს მონაცემთა დაკარგვაო, მე გაგაფრთხილე და შენ თავში ქვაც გიხლიაო და მერე წყნარად შეასრულებს exe ფაილს. რაც შეეხება C-ს, ჩემი დიდი მოლოდინისდა მიუხედავად მან ამ კოდის კომპილირებისას ის ერთი გაფრთხილებაც კი არ გამოიტანა. ქვემოთ მოცემულია შესაბამისი კოდი C++-თვის და ცომპილაციის შემდეგ გამოტანილი გაფრთხილება: #include "iostream" int F(); გაფრთხილება: warning C4244: 'return' : conversion from 'double' to 'int', possible loss of data. ბევრს ვერაფერს მოვთხოვთ C-ს მას შემდეგ რაც წავიკითხავთ შილდტის შემდეგ ფრაზას; აი რას გვეუბნევა: 1. თუ C-ში ფუნქციის დასაბრუნებელი ტიპი void-ისგან განსვავდება მაშინ ფაქტიურად მას არც მოეთხოვება რაიმეს დაბრუნება. 2. თუ მნიშვნელობა არ არის return-ში, მაშინ იგი აბრუნებს განუსაზღვრელ მნიშვნელობას. 3. C-ში თუ ფუნქციის მიერ დასაბრუნებელი ტიპი ცხადად არ არის მოცემული მაშინ იგი აბრუნებს მთელ ტიპს. C++-ში ასეთი წესი არ არის, ესე იგი დასაბრუნებელი ტიპი უნდა მიეთითოს ცხადად- ო. ვნახოთ პირველი: #include "stdio.h" int F(void); } ფუნქცია არაფერს არ აბრუნებს. მივაკომპილოთ და გავუშვათ:
დაგვიწერა 0; ვნახოთ ახლა C++-ში: #include"iostream" int F(); აი შედეგიც: error C4716: 'F' : must return a value. როგორც სჩანს C++ ევოლუციის უფრო მაღალ სტადიაზეა J. განვიხილოთ მეორე ფრაზა. “თუ მნიშვნელობა არ არის return-ში, მაშინ იგი აბრუნებს განუსაზღვრელ მნიშვნელობას.”გვაქვს კოდი: #include "stdio.h" int F(void); შედეგად დაწერს 0-ს. ახლა ვნახოთ C++; აი პასუხიც error C2561: 'F' : function must return a value. და ბოლოს, მესამე ფრაზა: “C-ში თუ ფუნქციის მიერ დასაბრუნებელი ტიპი ცხადად არ არის მოცემული მაშინ იგი აბრუნებს მთელ ტიპს. C++-ში ასეთი წესი არ არის, ესე იგი დასაბრუნებელი ტიპი უნდა მიეთითოს ცხადად” #include "stdio.h" F(void); კომპილირება, გაშვება და პასუხიც სახეზეა: 3. ახლა ვნახოთ C++-ში: #include "iostream" F(); ამ შემთხვევაში მან იკადრა რომ C-დან მემკვიდრეობით მიეღო რაღაც თვისება და თავი მაინცდამაინც არ გაუგიჟებია შეცდომების გამოტანით, მაგრამ სინდისი ეყო და ბოლოს მაინც შემოეფრთხილა, სასხვათაშიროსოდ: warning C4244: 'return' : conversion from 'double' to 'int', possible loss of data. . . . და ჩვეული სისწრაფით გამოვარდა Console ფანჯარა. პრინციპში აქ ბევრი რამე კომპილატორის რეალიზაციაზეც არის დამოკიდებული. შეგიძლიათ შეამოწმოთ იგივე კოდი Borland-ში: Turbo C++-ზე ან Builder-ზე. ჩემის აზრით ნებისმიერ კომპილატორს უნდა ჰქონდეს სტანდარტისადმი სრული მხარდაჭერა და თუ საჭიროა დაემატოს კიდევ რაღაც რაღაცეები. როგორც გამოცდილება მკარნახობს Borland-ი ამ საკითხებში უფრო მეტ გულისხმიერებას იჩენს ხოლმე, თუმცა ამას არ ვამტკიცებ – უბრალოდ შემოწმება უნდა. სულ ეს იყო. შემდეგ სტატიებში განვიხილავთ სხვა მსგავს “გაუგებრობებსაც”. რეზიუმე
ავტორი: გიორგი ბაწაშვილი (G3B) |
|
აღდგენილია სტატიის საწყისი ვარიანტი