 PS 9308




                        C++'IN TUZAKLARI

                                                      Tun Sabuncu



C'den daha gvenli bir programlama ortam salamak iddiasyla gelen C++'n
zenginlikleri yeni tuzaklar ieriyor.

Doumundan bu yana C zerine pek ok ey sylendi, yazld. Sayfalarmzda
ska yer verdiimiz bu grlerle birlikte C'nin bcek dolu tuzaklarndan da
bol bol sz ettik. 1970'lerden beri sregelen ve artk yazlm mhendisliinin
temel talarndan biri olan "gvenilirlik" ilkesi ne yazk ki kat stnde
kald. Son on yln abalar da yazlm gereleri etrafnda younlat ve bir
disiplin, bir standart oluturamad.

C'deki gvenilirlik sorunlarna yant olmas beklenen C++, C'de olmayan bir
ok zellik ve bu arada bir ok sorunu da beraberinde getirdi. Koyunun
olmad yerde keiye hep 'sayn kei!' demek zorunda kalan biz yazlmclar
iin durum C++ derleyicilerinde de ayn kald.


SAYIN BCEKLER...

Yazdmz kodun filan yerindeki bir noktalama yanl, iki tanmlama blounun
kesimesi bir soruna yol ayor, bu sorun da bir bakasna derken derleyicimiz
sorunun suyunun suyuna

"ERROR: invalid function name 'printf' cannot be used here"

gibi gayet gzel bir ileti veriyor. Yordamn o ksmn deliler gibi
inceliyorsunuz ama hayr, herey doru, hatta belki o kodu alan bir
programnzdan aynen kopyalamsnz. Derleyici neden hatann kaynan
bulamyor da at alan skdar' getikten sonra "bu iyi deil, bu program
almaz" gibi laflar sylyor? Bu bir bcek deil mi? Bir samala bcek
dememiz iin illa ki bilgisayarn kilitlenmesi gerekiyorsa ben bu tr
derleyici kusurlarn, reticiler Borland, Microsoft gibi isimlerin arkasna
saklandklar iin "sayn bcekler" olarak snflandryorum.

Bu sayn bcekler bir firmadan dierine byk eitlilik gsteriyor. Bir
yordamn szgelimi 55. satrdaki bir tanmlama yanln X derleyicisi 155.
satrda Y derleyicisi de 1055. satrda yakalayabiliyor. Tabi abuk subuk
iletiler sadece derleyiciyi yazanlarn hayal gleri ile snrl. Bu noktada
akla gelen bir baka nemli sorun da C++ iin hl bir ANSI standard
bulunmay. En azndan sayn bceklerin standardize olmas iin bu yaplmal!

imdi bir deney yapalm, hatal bir yordam parasn Borland C++ 3.1 ve
Microsoft C/C++ 7.0 ile derlemeye alalm.



01:   class X
02:   {
03:   public:
04:      X( int i );
05:      int calcul()  const;
06:      private:
07:      int m_i;
08:   }
09:
10:  X::X( int i);
11:  {
12:  m_i=i;
13:  }
14: // .......


Borland'n derleyicisi 11. satr iin "Type 'X' may not be defined here" ve
"Constructor cannot have a return type specification" derken Microsoft yle
buyuruyor: " 'X::X': Constructor not allowed a return type" ve " 'X::X':
Overloaded functions only differ by return type".

Oysa bu yordamdaki tek yanllk 8. satrda '}' dan sonra ';' bulunmay.
Aslnda C'den C++'ya yeni gemi programclarn kaderi bu. nk "zaten
kapanm" olan bir tanm blounu bir kez daha ';' ile kapamak pek akla
gelmiyor. Ana derleme srecinin satr satr yaplmasn anlayla karlyoruz
da derlemeden nce bu tr yanllar saptayacak bir nileyici olamaz m? Bu
nileyici ile "line 8, missing semicolon" (hani benim noktal virglm?) gibi
bir ileti ile programcnn btn kodu okumasnn nne geilemez mi? 



