რამეში ვერ უგებენ 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);
int F(void)
{
return 2;
}
void main(void)
{
printf("%d",F());
}
აი რას დაგვიწერს პროგრამა შესრულების შემდეგ:
ესე იგი შედეგი ნორმალურია. პასუხია 2.
ახლა შევცვალოთ მნიშვნელობა - ვთქვათ, 2-ის მაგიერ 2.3423: პროგრამა დაწერს ისევ 2-ს;
ზუსტად ასევე იქცევა C++-იც.
სხვათაშორის ეს, ამ ორივე ენის საერთო სენია; მაგალითად, პასკალისგან განსხვავებით, რომელიც ტიპების შეუსაბამობის დროს მაშინვე გამოიჩენს ჯელნტმენობას და გამოიტენს შეტყობინებას შეცდომის შესახებ, C++-ს გამოაქვს ერთი გაფრთხილება, რომ შეიძლება მოხდეს მონაცემთა დაკარგვაო, მე გაგაფრთხილე და შენ თავში ქვაც გიხლიაო და მერე წყნარად შეასრულებს exe ფაილს. რაც შეეხება C-ს, ჩემი დიდი მოლოდინისდა მიუხედავად მან ამ კოდის კომპილირებისას ის ერთი გაფრთხილებაც კი არ გამოიტანა.
ქვემოთ მოცემულია შესაბამისი კოდი C++-თვის და ცომპილაციის შემდეგ გამოტანილი გაფრთხილება:
#include "iostream"
using namespace std;
int F();
int F()
{
return 2.3423;
}
void main()
{
cout << F() << endl;
}
გაფრთხილება: 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);
int F(void)
{
}
void main(void)
{
printf("%d",F());
printf("%s","\nFree Text");
}
ფუნქცია არაფერს არ აბრუნებს. მივაკომპილოთ და გავუშვათ:
დაგვიწერა 0; ვნახოთ ახლა C++-ში:
#include"iostream"
using namespace std;
int F();
int F()
{
}
void main()
{
cout << F() << endl;
}
აი შედეგიც: error C4716: 'F' : must return a value. როგორც სჩანს C++ ევოლუციის უფრო მაღალ სტადიაზეა J.
განვიხილოთ მეორე ფრაზა. “თუ მნიშვნელობა არ არის return-ში, მაშინ იგი აბრუნებს განუსაზღვრელ მნიშვნელობას.”გვაქვს კოდი:
#include "stdio.h"
int F(void);
int F(void)
{
return;
}
void main(void)
{
printf("%d",F());
printf("%s","\nFree Text");
}
შედეგად დაწერს 0-ს. ახლა ვნახოთ C++; აი პასუხიც error C2561: 'F' : function must return a value.
და ბოლოს, მესამე ფრაზა: “C-ში თუ ფუნქციის მიერ დასაბრუნებელი ტიპი ცხადად არ არის მოცემული მაშინ იგი აბრუნებს მთელ ტიპს. C++-ში ასეთი წესი არ არის, ესე იგი დასაბრუნებელი ტიპი უნდა მიეთითოს ცხადად”
#include "stdio.h"
F(void);
F(void)
{
return 3.45;
}
void main(void)
{
printf("%d",F());
printf("%s","\nFree Text");
}
კომპილირება, გაშვება და პასუხიც სახეზეა: 3.
ახლა ვნახოთ C++-ში:
#include "iostream"
using namespace std;
F();
F()
{
return 3.45;
}
void main()
{
cout << F() << endl;
}
ამ შემთხვევაში მან იკადრა რომ C-დან მემკვიდრეობით მიეღო რაღაც თვისება და თავი მაინცდამაინც არ გაუგიჟებია შეცდომების გამოტანით, მაგრამ სინდისი ეყო და ბოლოს მაინც შემოეფრთხილა, სასხვათაშიროსოდ: warning C4244: 'return' : conversion from 'double' to 'int', possible loss of data. . . . და ჩვეული სისწრაფით გამოვარდა Console ფანჯარა.
პრინციპში აქ ბევრი რამე კომპილატორის რეალიზაციაზეც არის დამოკიდებული. შეგიძლიათ შეამოწმოთ იგივე კოდი Borland-ში: Turbo C++-ზე ან Builder-ზე. ჩემის აზრით ნებისმიერ კომპილატორს უნდა ჰქონდეს სტანდარტისადმი სრული მხარდაჭერა და თუ საჭიროა დაემატოს კიდევ რაღაც რაღაცეები. როგორც გამოცდილება მკარნახობს Borland-ი ამ საკითხებში უფრო მეტ გულისხმიერებას იჩენს ხოლმე, თუმცა ამას არ ვამტკიცებ – უბრალოდ შემოწმება უნდა.
სულ ეს იყო.
შემდეგ სტატიებში განვიხილავთ სხვა მსგავს “გაუგებრობებსაც”.
რეზიუმე
ეგეც შენი Microsoft-ი. გაუგებ რამეს?. . .
ავტორი: გიორგი ბაწაშვილი (G3B)
აღდგენილია სტატიის საწყისი ვარიანტი